c#/ .Net Socket.Shutdown

时间:2009-02-24 21:13:18

标签: c# .net sockets

我认识到这种类型的问题有很长的历史,但我使用它的方式必须是正确的'.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()中可能正在进行的任何异步处理。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

基于Socket.Disconnect

  

如果您需要在没有先打电话给Shutdown的情况下致电Disconnect,那么   可以设置DontLinger套接字选项   为false并指定非零   超时间隔,以确保数据   排队等待传出传输   发送。断开然后阻塞直到   数据被发送或直到指定   超时到期。如果你设置   DontLinger为false并指定零   超时间隔,关闭释放   连接并自动丢弃   传出的排队数据。

建议关闭最多是不必要的......

答案 1 :(得分:2)

重新使用套接字:

socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(true);

强制关闭使用:

socket.Shutdown(SocketShutdown.Both);
socket.Close();