之前开发过程中使用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));