Programmera spel i C++ för nybörjare/Nätverksprogrammering 2

Från Wikibooks


Chatt i UDP[redigera]

En chatt fungerar ungefär på samma sätt som när man skickar meddelanden mellan olika spel i ett nätverk. Det du behöver är egentligen bara att veta vilket IP-nummer mottagaren har. Ditt eget behövs inte. Du måste dessutom välja en port som inte används av andra program. Som standard används port nummer 4567. Utöver det behöver du ställa in din dators brandvägg för att kunna släppa igenom ditt program in- och ut ur nätverket.

Koden här nedanför är i grunden stulen, men redigerad och ändrad för att bli lättare att förstå. Den fungerar som gamla tiders walkie-talkie. Endera väntar man på meddelanden eller så tar man emot meddelanden. Buffern är 128 inklusive \0 tecknet i slutet. Skriver du ett meddelande som är mer än 127 tecken kraschar programmet. Våra svenska tecken åÅäÄöÖ fungerar bra, av någon anledning, det fungerar aldrig annars så det är bara att tacka och ta emot.

Varför inte båd sända och ta emot samtidigt?[redigera]

Ja varför inte? det är vad man är van vid. Enklaste förklaringen är att vi måste ha mer avancerad kod då. Den här koden är bara för att förklara de allra enklaste sätten att få datorer att tala med varandra.

Min dator har ett annat IP nummer än 192.168.x.x eller 10,100.x.x eller 169.254.x.x[redigera]

Då tittar du på fel IP-nummer. Börja med att söka upp ditt lokala IP-nummer (som INTE är 127.0.0.1) och använd det i koden. Tanken är att du skall kunna chatta med datorer inom samma lokala nätverk (t.ex. en skola eller i samma hus). Du borde få upp din lokala adress direkt när programmet startar (se koden här nedanför).

Hur kommer alla datorer åt programmet?[redigera]

  • Kompilera ditt projekt i release mode genom att ändra flervalsrutan i överkanten från debug till release.
  • Efter det skall du ha en .exe fil i en map som heter [Release] i ditt projekt. Kopiera den till en nätverksmapp som alla i nätverket kommer åt.
  • I den mappen måste du även ha filerna: msvcp100.dll och msvcr100.dll som ligger i Windowskatalogen i den dator som du skapat programmet, om du skapat programmet med hjälp av Visual C++.
  • Låt alla användare köra programmet direkt från mappen, det är så litet att alla borde kunna göra det utan att behöva kopiera det till sin egen dator.

Färdig kod[redigera]

//Originalkoden kommer från forumet på SFML:s hemsida
// http://www.sfml-dev.org/forum/viewtopic.php?t=5002

#include <SFML/Network.hpp> 
#include <iostream> 
#include <string> //Behövs för att skicka strings
using namespace std; 

#define SFML_STATIC //Se till så att det inte behövs extra DLL-filer

//Funktionerna
void sendMsg ();
void getMsg ();

int main (int argc, char **argv)
{ 
  bool sluta = false; //Driver loopen
  char janej = 'n'; //Om n, fortsätt
  char ch; //för att välja skicka eller ta emot

  //Visa upp lokal adress, troligen 192.168.x.x eller 10.100.x.x eller 169.254.x.x
  sf::IPAddress Address1 = sf::IPAddress::GetLocalAddress();
  std::string IP1 = Address1.ToString();
  std::cout<<"Din egen lokala IP-adress = " << IP1 << std::endl;

  while (sluta == false)
  { //while loop
  cout << "Skicka meddelande (S/s), ta emot meddelande (T/t) : "; 
  cin >> ch; 

  if (ch == 'S' || ch == 's') 
  { 
     sendMsg(); 
  } 
  else if (ch == 'T' || ch == 't') 
  { 
     getMsg(); 
  } 

   cout << "Vill du avsluta? J/N: "; 
   cin >> janej; 

   if (janej == 'j' || janej == 'J')
     {sluta = true;}
   else
     {sluta = false;}

  } //while loop
  return 0;
} 

//Funktion för att skicka meddelande
void sendMsg () 
{ 
  string ip = " "; 
  char msg[] = "Testmeddelande som inte skall synas."; 

  cout << "Fyll i mottagarens IP nummer: "; 
  cin >> ip;  //Ip adress som skall få meddelandet

  cout << "Skriv meddelandet: "; 
  cin >> msg; //Meddelandet som skall skickas

  sf::IPAddress Address1(ip); //ditt IP nummer
  sf::SocketUDP Socket; //En socket som får port 4567 här nedanför
   
  if (Socket.Send(msg, sizeof(msg), ip, 4567) != sf::Socket::Done) 
  { 
     cout << "Error, kan inte skicka meddelandet...\n"; 
  } 
} 

//Funktion för att ta emot meddelande
void getMsg () 
{ 
  sf::SocketUDP Socket; 

  if (!Socket.Bind(4567)) 
  { 
      cout << "Error, kan inte binda port 4567...\n"; 
  } 

  char Buffer[128]; 
  std::size_t Received; 
  sf::IPAddress Sender; 
  unsigned short Port; 
  if (Socket.Receive(Buffer, sizeof(Buffer), Received, Sender, Port) != sf::Socket::Done) 
  { 
     cout << "Error, kan inte skicka meddelandet...\n"; 
  } 

  cout << Sender << ":" << Port <<endl; 

  cout << Buffer <<endl; 
}