tcp通信的阻塞和非阻塞用法比较
mob 发布于 2024-03-10

之前开发过程中使用TCP通信,客户端的recv和send,服务端的recv和send都是各自开启独立线程进行发送和接收,recv和send都是阻塞,但是如果客户端想单方面结束线程,因为线程通信用全局变量进行判断,但问题在于如果已经在recv阻塞,其实是无法在循环中继续下一步结束线程,为什么之前却要用阻塞,因为如果socket断开,recv就会返回-1,继续往下执行,可以通过返回-1判断到断开终止运行,如果是非阻塞的,但时之后也是返回-1和断开返回-1一样,难以判断是要结束还是不结束。

其实还是用非阻塞的好,因为断开可以用其他补充机制,但是如果是阻塞的,一旦阻塞之后想结束就卡在线程中无法跳出来自行结束。

如果通过设置超时解决阻塞问题,可以设置超时

//设置发送超时

int nNetTimeout = 50;//单位ms,

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&nNetTimeout, sizeof(int));

如果是send设置超时,用SO_SNDTIMEO

setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nNetTimeout, sizeof(int));

 

 

mob
关注 私信
文章
61
关注
0
粉丝
0