многопоточные шахматы с использованием winsock - PullRequest
0 голосов
/ 05 июня 2011

Я работал над небольшим сетевым шахматным приложением.Мне удалось создать сервер, который может обрабатывать несколько соединений, однако я не знаю, как отправлять данные с одного клиента на другой.

Вот частичная реализация сервера

//function to handle our Socket on its own thread.
//param- SOCKET* that is connected to a client
DWORD WINAPI HandleSocket(void* param)
{
string test;

SOCKET s = (SOCKET)param;
User temp;
temp._socket = (SOCKET)param;
temp._inGame = false;
userlist.add(&temp);

std::cout<<"connection"<<endl;
int bytesread = 0;  
int byteswrite=0;

while(true)
{
    //receive
    bytesread = recv(s, reinterpret_cast<char*>(test.c_str()), BUF_LEN, 0);

    //error check   
    if(bytesread == SOCKET_ERROR)
    {
        std::cout << WSAGetLastError();
        //shutdown and close on error
        shutdown(s, SD_BOTH);
        closesocket(s);
        return 0;
    }


    //check for socket being closed by the client
    if(bytesread == 0)
    {
        //shutdown our socket, it closed
        shutdown(s, SD_BOTH);
        closesocket(s);
        return 0;
    }

    byteswrite = send(s, "test" , 255 , 0);
    if(byteswrite == SOCKET_ERROR)
    {
        std::cout << WSAGetLastError();
        //shutdown and close on error
        shutdown(s, SD_BOTH);
        closesocket(s);
        return 0;
    }

    test.clear();
}
}

1 Ответ

2 голосов
/ 05 июня 2011

Может быть, вы должны начать поток для новой игры, когда оба игрока игры подключены к серверу. В этом случае вы можете доставить оба сокета в поток следующим образом:

DWORD WINAPI HandleGame(void* param)
{
    GameState* game = (GameState*)param;
    SOCKET s1 = game->getSocketOfPlayer(1);
    SOCKET s2 = game->getSocketOfPlayer(2);
    ...
    // TODO: Forward game messages between clients (players).    
    ...
    delete game;
    return 0;
}

Альтернативные решения: реализовать серверную программу в потоке sigle.

В обоих случаях вам, вероятно, понадобится функция select () для ожидания сообщений от нескольких игроков одновременно.

...