безопасно ли возвращать 0, чтобы обнаружить ошибку сокета? - PullRequest
3 голосов
/ 09 июля 2009

Безопасен ли вызов сокета TCP для вызова:

if(SOCKET_ERROR != recv(s, NULL, 0, 0))
//...

для обнаружения ошибок?

Я думал, что это безопасно, и у меня возникла ситуация на компьютере, где он зависал в этом заявлении. (был с сокетом ssl, если это имеет значение). Я также попытался передать флаг MSG_PEEK с указанным буфером, но у меня также было зависание там.

Какая альтернатива?

Ответы [ 3 ]

4 голосов
/ 09 июля 2009

В дополнение к другим ответам - вот небольшая удобная функция для получения ожидающей ошибки сокета:


/* Retrives pending socket error. */
int get_socket_error( int sockfd )
{
    int error;
    socklen_t len( sizeof( error ));

    if ( getsockopt( sockfd, SOL_SOCKET, SO_ERROR, &error, &len ) < 0 )
        error = errno;

    return error;
}
3 голосов
/ 09 июля 2009

Вы сказали, что используете блокирующий сокет, но вместо этого вы должны использовать select (даже если вы установили его разблокировку перед вызовом select). Это позволяет вам опросить файловый дескриптор и посмотреть, есть ли ожидающие данные, или если есть ошибка.

2 голосов
/ 09 июля 2009

Сам вызов является "безопасным" в том смысле, что он должен работать как задокументированный , однако вы должны понимать, что recv является блокирующим вызовом приема. Это означает, что вызов заблокирует исполняющий поток, пока данные не поступят в сокет. Это может привести к зависанию приложения, если вы не используете другой поток для получения или проверки наличия данных до получения вызова ( выберите ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...