У меня проблема с функцией recv() в неблокирующем сокете (язык c под Unix) У меня установлен сокет для неблокирования с помощью кода ниже (серверная программа):Функция сокета программирование-recv()
int x;
x=fcntl(listen_sd,F_GETFL,0);
fcntl(listen_sd,F_SETFL,x | O_NONBLOCK);
, когда я звоню recv()
, если сообщение доступно, оно возвращает длину сообщения, если оно не блокирует !!
i sued функция выбора в моем коде тоже.
while(1)
{
/**********************************************/
/* Receive data on this connection until the */
/* recv fails with EWOULDBLOCK. If any other */
/* failure occurs, we will close the */
/* connection. */
/**********************************************/
rc = recv(i, buffer, sizeof(buffer), 0);
if (rc < 0)
{
if(errno == EAGAIN||errno == EWOULDBLOCK)
{
printf("no message\n");
break;
}
perror(" recv() failed");
close_conn = TRUE;
}
/**********************************************/
/* Check to see if the connection has been */
/* closed by the client */
/**********************************************/
if (rc == 0)
{
printf("connection closed\n");
close_conn = TRUE;
break;
}
/**********************************************/
/* Data was recevied */
/**********************************************/
len = rc;
printf(" %d bytes received\n", len);
}
, если клиент посылает сообщение и не закрывает соединение, то сервер в первом вызове RECV() получает сообщение и во втором вызове блокируется (другими словами RECV() не возвращает ошибку EWOULDBLOCK вообще !!) Почему?
работает здесь с гнездом UDP – hroptatyr