recv传递0来检测套接字错误是否安全?

时间:2009-07-09 11:56:28

标签: c++ sockets

对于TCP阻塞套接字,可以安全地调用:

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

检测错误?

我认为这是安全的,然后我在计算机上遇到了这个声明。 (如果重要的话,有一个ssl套接字)。我也尝试使用指定的缓冲区传递MSG_PEEK标志,但我也有一个挂起。

有什么替代方案?

3 个答案:

答案 0 :(得分:4)

除了其他答案之外 - 这是一个方便的小函数来获取挂起的套接字错误:


/* 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;
}

答案 1 :(得分:3)

您确实说过使用了阻塞套接字,但您应该使用select(即使您在select调用之前将其设置为unblocking)。它允许您轮询文件描述符并查看是否有数据等待,或者是否有错误。

答案 2 :(得分:2)

在某种意义上,呼叫本身是“安全的”,它应该以documented的形式运行,但是您必须意识到recv是阻止接收呼叫。这意味着调用将阻塞执行线程,直到数据到达套接字。如果您没有使用其他线程进行接收,或者在接听电话(select之前检查数据是否可用),这可能会导致应用程序“挂起”。