Проблема с сокетом UDP - PullRequest
       11

Проблема с сокетом UDP

0 голосов
/ 10 января 2010

Я пишу многопользовательскую игру (очевидно, с использованием сокетов UDP. Примечание: использование winsock 2.2). Код сервера выглядит примерно так:

while(run)
{
    select(0, &readSockets, NULL, NULL, &t)
    if(FD_ISSET(serverSocket, &readSockets))
    {
        printf("%s\n","Data receieved");
        //recvfrom over here
    }
    FD_SET(serverSocket, &readSockets);
}

Пока это не получает данные от моего клиента, это:

recvfrom(serverSocket, buffer, sizeof(buffer), 0, &client, &client_size);

Ответы [ 4 ]

1 голос
/ 10 января 2010

FD_SET находится в конце цикла, поэтому похоже, что ваш первый вызов select() может иметь пустой или неинициализированный fd_set. Убедитесь, что вы используете FD_ZERO(&readSockets) и FD_SET(serverSocket, &readSockets) перед циклом. Также было бы хорошо проверить ошибки на вызове select().

1 голос
/ 10 января 2010

Одной из возможных проблем здесь, возможно, является select() вызов. Я считаю, что первый параметр должен быть наибольшим номером сокета +1.

0 голосов
/ 10 января 2010

Вы должны проверить ошибки, возвращенные select(). В Windows это будет что-то вроде:

if (( nret = select( nfds, &rset, &wset, &eset, &to )) == SOCKET_ERROR )
{
   // error handling, probably with WSAGetLastError()
   // ...
}

Поскольку похоже, что вы используете тайм-аут, select() также может возвращать ноль, т. Е. Дескрипторы сокетов не готовы, но время ожидания истекло.

0 голосов
/ 10 января 2010

Хммм ... немного поиграв с кодом, я нашел следующие строки:

console->clear();
console->resetCursorPosition();

Итак, получал данные, но сообщение на консоли мгновенно стиралось. [Вздыхать]

...