关注对了,不知道用shutdown怎么样?这个据说可以很“优雅”的关闭:)
解决方案 »
- 请问如何实现多线程并发的ATL组件?
- 关于TCP_SOCKET的问题
- 请教关于windows media format sdk中使用第三方编码格式生成asf文件的问题
- LoadLibrary 返回值为空,错误代码193
- SHFileOperation函数总是出错。
- 在非对话框容器中调用activex出错
- getline()函数中如何判断输入结束?
- 鼠标指向?
- 请问:用CFilDialog打开多个文件时,如何纪录下所打开的多个文件名???(很急)(100请进)
- 求助:谁用过微星的ms1 845 uitra-c------------(100)
- 奇怪的问题:MFC,多线程,Socket,变量存取的问题?
- 我想要一个简单的数据库,自己正在做,但不知有没有现成的。比如说类似flashget or netant 的数据库
一个应用程序可以通过打开SO_KEEPALIVE选项,使得WINDOWS套接口实现在TCP连接情况下允许使用“保持活动”包。一个WINDOWS套接口实现并不是必需支持“保持活动”,但是如果支持的话,具体的语义将与实现有关,应遵守RFC1122“Internet主机要求-通讯层”中第4.2.3.6节的规范。如果有关连接由于“保持活动”而失效,则进行中的任何对该套接口的调用都将以WSAENETRESET错误返回,后续的任何调用将以WSAENOTCONN错误返回。
默认为雅致的,也就是所有正在进行中的数据完成之后才真正关闭,释放资源,这也是服务程序关闭后立即重启时有时会bind失败的原因.
我试过强制关闭,最后一个send返回之后立即closesocket,客户端发生连接被复位错误.程序:STATE 是 int , s 是将要设为强制关闭的套接字
//设置套接字选项,强制关闭,仅用于程序强制退出时,否则将丢失数据
STATE SetSocketCloseHard(SOCKET s)
{
struct linger ling1;
int ret; ling1.l_onoff=1;
ling1.l_linger=0;
ret=setsockopt(s,SOL_SOCKET,SO_LINGER,(char *)&ling1,sizeof(ling1));
if(SOCKET_ERROR==ret)return -1;
else return 1;
}
无论是Nonblocking还是SO_KEEPALIVE都没用
我在调试的时候,在send()之前把网线拔了,还是没有报错!
为什么我期待的错误总是不出现!!!!!!?????
在连接建立后拔掉网线的情况下, Nonblocking的recv()会报Timeout, Blcoking的recv()会等到你心疼.
send()还是快乐的正常执行.
不如你也做做这个实验吧
server accept()一个连接,然后把client端的程序关掉,
server再send(),看会不会报错.
用try{
send()}
catch(...){}
试试,看它跳进陷阱不
client断开连接,server收到一个FIN,并发了个ACK
这时,server程序执行到send(),
server发出去的包是URG=1,Push=1,然后收到的是client送过来的RST难道send()不是收到对方的ACK才返回字节数的吗?
难道是Nonblocking的问题? 可是我已经设成Blocking的了呀!
faint
我在server端最后再做一次recv(),WSAGetLastError()在正常的情况下,连接关闭已经完成,WSAGetLastError()返回的是0或者10035;如果client在server的上一个send()之前已经关闭,server会收到一个RST=1的包,WSAGetLastError()返回10058或者10054;如果client掉线,server的WSAGetLastError()也不会返回0和10035,好象还是10058