繁体   English   中英

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

[英]is it safe to recv passing in 0 to detect a socket error?

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

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

检测错误?

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

有什么选择?

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


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

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

从某种意义上说,呼叫本身是“安全的”,它应该按照记录的方式工作,但是你必须意识到recv是一个阻塞接收呼叫。 这意味着调用将阻塞执行线程,直到数据到达套接字。 如果您没有使用其他线程进行接收,或者在呼叫接收( 选择 )之前检查数据是否可用,这可能会导致应用程序“挂起”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM