关注对了,不知道用shutdown怎么样?这个据说可以很“优雅”的关闭:)
解决方案 »
- recv的问题?
- GIS中地理坐标和五四坐标如何转换??
- 我写的驱动,一在卸载时一调用IoDeleteDevice(pDevExt->pDevice)这句就蓝屏,希望高手指教,不慎感激!
- 请问哪有下载老潘的 com 原理和应用 电子书 或者谁有发给我一份 [email protected] 谢谢
- 50分求解,如何在视图里面插入ActiveX
- 学习了半年VC想再学JAVA,不知道这两种语言的最大不同点在什么地方?
- ODBC API、OLE DB和ADO,那个性能更好
- 查询Oracle记录总数出错的问题
- 如何在窗口外获取鼠标的位置。各位高手扶一下贫,这里还是奴隶社会.
- 请教画扇形函数
- 奇怪的问题: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