运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

选择说套接字是准备好读的时候肯定没有(实际上已经关闭)

运维开发网 https://www.qedev.com 2020-07-13 17:35 出处:网络 作者:运维开发网整理
在我的服务器中,我检查是否有任何套接字已准备好使用select()来确定它.因此,在主循环中,每次迭代时都会执行select(). 为了测试服务器,我写了一个简单的客户端,只发送一条消息,然后退出. BTW.我使用协议缓冲区来发送信息 – 消息表示此库中类型为Message的对象. 测试会话看起来像: > select() >服务器的套接字准备好读取 > accept()客户端的套接字 >从客户端
在我的服务器中,我检查是否有任何套接字已准备好使用select()来确定它.因此,在主循环中,每次迭代时都会执行select().

为了测试服务器,我写了一个简单的客户端,只发送一条消息,然后退出. BTW.我使用协议缓冲区来发送信息 – 消息表示此库中类型为Message的对象.

测试会话看起来像:

> select()

>服务器的套接字准备好读取

> accept()客户端的套接字

>从客户端套接字读取消息

> select()

>服务器的套接字未准备好读取,客户端就绪

>从客户端套接字读取消息

最后一步是错误的,因为客户端已经关闭了连接.因此protobuf库会出现Segmentation故障.我想知道为什么FD_ISSET表示套接字在关闭时已在步骤6中准备就绪.如何检查插座是否关闭?

编辑:

我已经找到了如何检查套接字是否打开

int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len );
套接字是“可读”的,如果远程对等体关闭它,你需要调用recv并处理它返回错误的情况,以及它返回0的情况,这表明对等体以有序的方式关闭连接.

读取SO_ERROR sockopt不是正确的方法,因为它返回当前的挂起错误(来自,例如,非阻塞连接)

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消