A ja mam jeszcze jedno pytanie. Udało mi się już zaimplementować mechanizm chińczyka dla 4 osób (zrezygnowałem z szachów). Próbuję teraz zrobić mechanizm sieciowy.
Generalnie podszedłem do sprawy nastepująco: mam klasę gamedata przechowującą dane gry na serwerze. W momencie wyboru piona przez gracza następuje aktualizacja danych w klasie gamedata za pomocą algorytmu. I jak zostanie zakończona, to wysyłam zaktualizowane dane do klienta, aby manager rysowania zrobił swoje.
Próbowałem na razie zrobić komunikację klient-serwer na zasadzie wymiany komunikatów (analogicznie jak na stronie tej http://firsthost.nazwa.pl/wordpress/2007/08/01/winsock-tutorial-2-laczenie-z-hostem/ oraz tej http://firsthost.nazwa.pl/wordpress/2007/08/12/winsock-tutorial-3-serwer/. Jednak działa tylko dla statycznego message. Jak chcę wczytać wiadomość z linii poleceń, to nie przesyła niestety.
Nie wiem jak sobie z tym poradzić. Nie wiem, czy dobrze podchodzę do tematu, ale zrobiłem następująco
serwer:
#include <winsock2.h>
#include <cstring>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKADDR_IN saddr;
SOCKET sock;
const char *helloMessage = "Czesc Michalek... :)";
char bufor[1024*20] ={0};
char message[100] = {0};
WSAStartup( MAKEWORD(2,2), &wsaData );
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset( (void*)&saddr, 0, sizeof(saddr) );
saddr.sin_family = AF_INET;
saddr.sin_port = htons(10000);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
if ( bind(sock, (sockaddr*)&saddr, sizeof(saddr)) != SOCKET_ERROR )
{
if ( listen(sock, 1) != SOCKET_ERROR )
{
for (int i = 0; i < 5; i ++ ) {
SOCKET client = accept(sock,NULL,NULL);
send(client, helloMessage, strlen(helloMessage), 0);
recv(sock,bufor,1024*20,0);
cout<<"L:";
cin>>message;
send(client,message,strlen(message),0);
closesocket(client);
}
}
}
closesocket(sock);
WSACleanup();
system("pause");
return 0;
}
i klient:
#include <iostream>
#include <winsock2.h>
using namespace std;
u_long resolveHost( const string &host )
{
LPHOSTENT hostEntry = gethostbyname(host.c_str());
if ( !hostEntry )
{
unsigned int addr = inet_addr( host.c_str() );
hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);
if ( !hostEntry )
{
return 0;
}
}
return *((int*)*hostEntry->h_addr_list);
}
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKADDR_IN saddr;
SOCKET sock;
char *http_req = "Witaj serwerze.";
char index[1024*20] = { 0 };
char mess[100];
WSAStartup( MAKEWORD(2,2), &wsaData );
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
saddr.sin_addr.S_un.S_addr = resolveHost ("192.168.1.2");
saddr.sin_family = AF_INET;
saddr.sin_port = htons(10000);
if ( connect(sock, (sockaddr*)&saddr, sizeof(sockaddr)) == SOCKET_ERROR )
{
/* połączenie się nie powiodło */
sock = 0;
return -1;
}
send(sock,http_req,strlen(http_req),0);
recv(sock,index,1024*20,0);
cout<<"M: ";
cin>>mess;
send(sock,mess,strlen(mess),0);
cout << index << endl;
closesocket(sock);
WSACleanup();
system("pause");
return 0;
}
I moje pytanie w tym miejscu jest takie:
- czy komunikat "Witaj serwerze" powinien pojawić się w oknie serwera? (bo się nie pojawia, pojawia się jedynie Witaj Michalek u klienta)
- w jaki sposób zmienić kod, aby wczytany do zmiennej mess komunikat został wysłany na serwer i wyświetlony, i na odwrót - wpisany do zmiennej message na serwerze wyświetlił się u klienta?
Jeśli robię błędy merytoryczne w obu pytaniach proszę mnie naprostować :)
Dzięki z góry za odpowiedź ;]