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.