c recv, пока не будет возвращен ноль

#c #sockets #recv

#c #сокеты #recv

Вопрос:

В моем клиентском коде (я также контролирую серверный код) Я хочу сделать что-то вроде этого;

 while( (result = recv(sock_fd, in_buff, SRV_BUFF_SIZE, 0)) >= 0 )
{
    // do something with in_buff    
}
printf("Exited recv loop with result = %in", result);
  

Но, конечно recv , никогда не возвращает ноль, если сервер не закроет сокет.

Есть ли способ для сервера отправить что-то, что убеждает recv выйти? Я не думаю, что мне нужно продолжать открывать и закрывать сокет (кажется расточительным).

Комментарии:

1. Может быть, вы ищете fcntl() и F_SETFL и O_NONBLOCK ? Осторожно: вращение может быть хуже, чем блокировка. И вы правы, что recv() не вернется 0 , если другой конец сокета не будет закрыт.

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

3. Вы не указываете, какой протокол вы используете. Если это сокеты tcp или stream unix, четко укажите это. Обратите внимание, что с сокетами datagram и seqpacket вы действительно можете отправлять и получать пакеты размером 0, поэтому ваше утверждение о том, что «recv никогда не возвращает ноль, если сервер не закроет сокет», является ложным.

4. @JonathanLeffler Нет, это верно только для потоковых сокетов. А с tcp-сокетами есть «срочные данные», MSG_OOB , POLLPRI , и т.д.