2010-01-10 1 views
-3

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

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); 
+0

и в чем проблема? почему бы вам не использовать recvfrom - канонический способ чтения из сокетов UDP? –

+0

@eli - потому что я не хочу, чтобы он блокировался, так как консоль сервера тоже должна обновляться ... – aviraldg

+0

В чем вопрос? – Kugel

ответ

0

Ммм ... после того, как вожусь с кодом немного, я нашел эти строки:

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

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

1

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

+0

и как вы это узнаете? – aviraldg

+0

Цитирование документации winsock: Параметр 1: nfds - включен для обратной совместимости – aviraldg

+1

Вам понадобится, чтобы он работал на не-Windows-системах. С одним сокетом это будет 'serverSocket + 1'. – mark4o

1

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

+0

Yep ... Я уже делаю это ... – aviraldg

+1

Так '' select() 'возвращает ошибку или не возвращается? – mark4o

+0

Нет, он не возвращает ошибки – aviraldg

0

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

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

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