accept_linger.l_onoff = 1; // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
accept_linger.l_linger = 5; // (容许逗留的时间为0秒) //设置接受超时
::setsockopt(accept_socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));
//设置关闭之后马上断开
::setsockopt(accept_socket, SOL_SOCKET, SO_LINGER,(const char*)&accept_linger,sizeof(accept_linger));
//加入到socket_set中
FD_SET(accept_socket,&socket_set);
SO_LINGER 是另一个东西,避免主动close后端口进入TIME_WAIT状态;
#ifdef WIN32
unsigned long ul = 1;
ioctlsocket(m_Socket, FIONBIO, &ul);
#else
int flags = fcntl(s, F_GETFL, 0);
return fcntl(m_Socket, F_SETFL, flags | O_NONBLOCK);
#endif
我也说说我自己的vc心得,一切皆消息,一切皆线程。
不是用select实现的异步通信吗???? 和你的属于俩中方法???学程序不能靠读书吧,开源的东西才是最好的学习教材。我能想起来的上一本书好像还是入门书籍。
阻塞模式下,即使建立单独线程,也无法优雅结束线程,所以我几乎很少用同步方式了。举例来说,断点续传文件,用户退出程序,你的接收线程还在阻塞着,怎么办呢?只好强行结束线程,可是进度状态怎么保存呢?只好在另外的线程里做,程序就变复杂了,这就是不能优雅结束线程的结果。如果是异步,循环里检查到退出标志就保存状态,退出线程,很自然。如果用同步,不知道谁有好的办法告知一下比较常见的做法还是做多线程同步,不然不好处理。
我不明白你为何不用线程同步,是因为对同步技术不够了解吗
你的程序要想优雅结束,常见的做法是做多线程同步
我这么说你是否明白我表达的意思
至于说断网的时候阻塞会是好几十秒,这种问题就看你要用什么策略处理
如果在windows机制下,
假设我们用多线程处理通信程序,
一般来说,除了主线程之外,
至少需要一个socket工作线程,一个数据处理线程,再加一个状态和异常处理线程(控制线程)
控制线程可以根据用户指令,再需要的时候去管退另外两个线程,
有必要的时候就强制关闭另外的线程。