我认识到这种类型的问题有很长的历史,但我使用它的方式必须是正确的'.net方式',但它似乎不起作用。
我有一个简单的同步IP服务器守护进程,它做一个简单的AcceptSocket,做一些东西,socket.send,socket.shutdown,socket.close。我的客户端是另一个简单的C#应用程序,它执行URLDownloadToFile。
当URLDownloadToFilefails的部分时间失败(0x800C0008)时,会发生什么。认为其下载资源失败。
我的服务器端结束序列是:
socket.Shutdown(Both);
socket.Close();
如果我将其更改为
socket.Disconnect();
socket.Close();
(我打开上面的sockopt Linger是真的,超时5秒)
这很有效。
我在Shutdown方法上遗漏了一些东西......听起来好像MS希望你使用'魔术子弹'优雅地进行退出,最终会发送任何剩余的发送数据。
总的来说,(并且这可能不对)看起来像关闭..杀死了shutdown()中可能正在进行的任何异步处理。
有什么想法吗?
答案 0 :(得分:3)
如果您需要在没有先打电话给Shutdown的情况下致电Disconnect,那么 可以设置DontLinger套接字选项 为false并指定非零 超时间隔,以确保数据 排队等待传出传输 发送。断开然后阻塞直到 数据被发送或直到指定 超时到期。如果你设置 DontLinger为false并指定零 超时间隔,关闭释放 连接并自动丢弃 传出的排队数据。
建议关闭最多是不必要的......
答案 1 :(得分:2)
重新使用套接字:
socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(true);
强制关闭使用:
socket.Shutdown(SocketShutdown.Both);
socket.Close();