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.