Я пишу функцию C, чтобы проверить, доступно ли соединение сокета от клиента. Я использую функцию recv с MSG_PEEK, чтобы не изменять входной буфер.
Однако, когда соединение сокета закрывается клиентом, 'recv' должен возвращать -1, но это не так. После закрытия клиента 'recv' в приведенной ниже функции всегда возвращает 0.
char is_avail(int connection) {
char buffer;
int result = recv(connection,&buffer,1,MSG_PEEK);
if (result<0)
return 0;
else
return 1;
}
Любая причина для этого вопроса? а также я хочу объединить MSG_PEEK с MSG_WAITALL. Я пытался:
recv(connection,&buffer,1,MSG_PEEK|MSG_WAITALL);
но это не вступает в силу.
recv
на сокете, на котором вы вызывалиlisten
? - person cnicutar   schedule 21.08.2012MSG_WAITALL
, так как он будет заблокирован, пока не сможет выполнить ваш запрос. Таким образом, он будет блокироваться до тех пор, пока не появятся данные для чтения (или просмотра в вашем случае), что теоретически может быть навсегда. - person Some programmer dude   schedule 21.08.2012