2013-06-12 2 views
5

Я использую функцию ioctlsocket(), чтобы сделать мой сокет неблокирующим, но когда я вызываю recvfrom(), я получаю ошибку 10035 (WSAEWOULDBLOCK).recvfrom() error 10035 с использованием неблокирующих сокетов

u_long mode = 1; 
ioctlsocket(newSocketIdentifier, FIONBIO, &mode); 

while(1) 
    { 
     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
     { 
     char err[128]; 
     itoa(WSAGetLastError(),err,10); 
     MessageBox(NULL,"Could not Receive Data",err,MB_ICONINFORMATION); 
     BREAK; 
     } 
    } 

Может кто-нибудь объяснить, почему это происходит? :(

+0

Вызов ввода-вывода может завершиться неудачно. Вы уверены, что вы * преуспеваете *, так как не блокируете сокет? – unwind

+1

Вы получаете WSAEWOULDBLOCK в неблокирующем сокете, если в настоящее время данных нет. Это нормальное поведение. –

ответ

10

Это нормально, если данные не доступны. Код WSAEWOULDBLOCK (см этой таблицы) и означает, что на блокирующий порт функции придется сидеть и ждать, пока он не может быть обслужен.

while(1) 
    { 
     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
     { 
     int ierr= WSAGetLastError(); 
     if (ierr==WSAEWOULDBLOCK) { // currently no data available 
      Sleep(50); // wait and try again 
      continue; 
     } 

     // Other errors 
     char err[128]; 
     itoa(ierr,err,10); 
     MessageBox(NULL,"Could not Receive Data",err,MB_ICONINFORMATION); 
     break; 
     } 
    } 
+0

Спасибо для ответа, но я Клиент постоянно читает данные из текстового файла и отправляет через сокет, а затем, как нет данных, доступных для чтения? :( – Ayse

+0

Любой короткий цикл, так как ваш будет быстрее, чем пакеты arr по сети. Если вы получите WSAEWOULDBLOCK, просто заставьте ваш цикл спать в течение нескольких миллисекунд (например, Sleep (50)) и продолжайте. – Grezgory

+0

Большое спасибо. Теперь он работает с Sleep(), но вы думаете, что это хороший подход? Первоначально я использовал WSAWaitforMultipleEvents(), чтобы сделать вызов recvfrom(), только когда стало доступно событие FD_READ. Я думал, что это похоже на неблокирующие сокеты, но тогда кто-то дал мне идею использования ioctlsocket(). – Ayse