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);
解决方案 »
- 多线程问题???
- vc++中如何获取环境变量并将其转换成字符串。
- 用VC++,怎么从数据库(SQL Server)中读取图片字段?没有什么大的数据类型?>
- 哪位大虾有《visual c++界面编程技术》的源代码?谢谢了
- 谁知道在VC中怎么设置环境变量?
- 紧急求助!!!关于视频放大的问题!!!!
- 想买个电子阅读器或掌上电脑,请给点建议。
- windows对回调函数的调用过程
- DELPHI和ASP相结合是在什么时候?
- 在COM接口中添加接口函数,myproject.idl文件中定义如下. 编译连接时出现语法错误," myproject.idl(24) : error MIDL2025 : syntax error
- 点击mfc单文档在任务栏下的图标,菜单中非模态对话框消失的问题
- mfc问题
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工作线程,一个数据处理线程,再加一个状态和异常处理线程(控制线程)
控制线程可以根据用户指令,再需要的时候去管退另外两个线程,
有必要的时候就强制关闭另外的线程。