Witam.

Chciałem napisać grę kółko i krzyżyk umożliwiającą grę w sieci, dla dwóch osób.

Mam kłopoty z zaimplementowaniem obsługi sieci, aby te programy się widziały, niestety nie udaje mi się.

Najpierw staram się utworzyć serwer i nasłuchiwać połączenia, aby znaleźć drugiego gracza, który się próbuje połączyć na odpowiednim porcie:

class Net
{
  private:
   WSADATA wsaData;
   SOCKET s, sock;


  public:
   Net()
	{
		int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
		if ( iResult != NO_ERROR ) throw "Wystąpił błąd przy WSASTARTUP";
		s = 0;
		sock = 0;
	}

   SOCKET ZwrocSocket()  {return s;}

   SOCKET Utworz_socket()
	{
	 //SOCKET soket;
	 struct sockaddr_in addr;
	 struct hostent *hp;

	 if ( (hp = gethostbyname("127.0.0.1")) == 0) throw "Wystąpił bład przy adresie";

	 else
	  {
	   memset(&addr, 0, sizeof(struct sockaddr_in));
	   memcpy((char *)&addr.sin_addr, hp->h_addr, hp->h_length);
	   addr.sin_family = AF_INET;
	   addr.sin_port = htons(30000);

	   s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	   if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) != 0) throw "Wystąpił bład przy sokecie";

	   else return s;
	  }
	}

   SOCKET Serwer()
	{
	 struct sockaddr_in sin;
	 memset( &sin, 0, sizeof(sin) );
	 sin.sin_family = AF_INET;
	 sin.sin_addr.s_addr = INADDR_ANY;
	 sin.sin_port = htons(30000);
	 while (s == 0)
		 {
	 if ( bind(sock,(struct sockaddr *)&sin, sizeof(sin)) != SOCKET_ERROR )
	  {
		if ( listen(sock, 2) != SOCKET_ERROR )
		 {
		  s = accept(sock,NULL,NULL);
		 }
	   //	else throw "Blad przy listen";
	  }
   //	  else throw "Blad bind";
	  }
	 return s;
	}

   void Zamknij_polaczenie()
	{
	 closesocket(s);
	 WSACleanup();
	}
};

void __fastcall TPlansza::Button1Click(TObject *Sender)
{
  
   net = new Net;
   watek = CreateThread(NULL,0,ZnajdzHost, (LPVOID) 0,0,&idwatku);
}

DWORD WINAPI ZnajdzHost( LPVOID lpParam )
 {
  while(net->Serwer() == 0);
  Plansza->Status->Lines->Add((AnsiString)net->ZwrocSocket());
  return 0;
 }

I klient, który próbuje się połączyć:

int main(int argc, char* argv[])
{
 WSADATA wsaData;
 SOCKET s=0;
 bool koniec = false;
 char wybor;

 int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
 if ( iResult != NO_ERROR ) cout<<"Blad iresult";

 struct sockaddr_in addr;
 struct hostent *hp;

 while (koniec == false)
  {
   cout<<"Poczatkowa wartosc zmiennej s = "<<s<<"\n\n";

 if ( (hp = gethostbyname("127.0.0.1")) == 0) cout<<"Wystąpił bład przy adresie\n\n";
  else
   {
	memset(&addr, 0, sizeof(struct sockaddr_in));
	memcpy((char *)&addr.sin_addr, hp->h_addr, hp->h_length);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(30000);

	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) != 0) cout<<"Nie udalo sie polaczenie\n\n";
   }

   cout<<"Koncowa wartosc zmiennej s = "<<s<<"\n\n";
   cout<<"Czy zakonczyc [t/n]";
   cin>>wybor;
   if(wybor == 't') koniec = true;
  }

	return 0;
}

Ps. Wiem, że kod wygląda dziwnie, ale zależy mi na tym, aby się to ze sobą połączyło, a potem będzie wszystko przepisywane i optymalizowane.