c#/ .Net Socket.Shutdown

use*_*567 5 .net c# sockets

我认识到这种类型的问题有很长的历史,但我使用它的方式必须是正确的'.net方式',但它似乎不起作用.

我有一个简单的同步IP服务器守护进程,它执行一个简单的AcceptSocket,做一些东西,socket.send,socket.shutdown,socket.close.我的客户端是另一个简单的C#应用​​程序,它执行URLDownloadToFile.

会发生的事情是URLDownloadToFilefails失败的部分时间(0x800C0008)..认为其下载资源失败.

我的服务器端结束序列是:

socket.Shutdown(Both);
socket.Close();
Run Code Online (Sandbox Code Playgroud)

如果我改成这个

socket.Disconnect();
socket.Close();
Run Code Online (Sandbox Code Playgroud)

(我用sockopt Linger打开以上内容,超时5秒)

这很棒.

我在Shutdown方法上遗漏了一些东西......听起来好像是"魔术子弹"MS希望你用它来优雅地进行退出,最终会发送任何剩余的发送数据.

总而言之,(这可能不对)看起来像关闭..杀死了shutdown()可能正在进行的任何异步处理.

有任何想法吗?

Shu*_*oUk 3

基于Socket.Disconnect

如果需要在不先调用 Shutdown 的情况下调用 Disconnect,则可以将 DontLinger Socket 选项设置为 false 并指定非零超时间隔,以确保发送排队等待传出传输的数据。然后 Disconnect 会阻塞,直到数据发送完毕或指定的超时到期。如果将 DontLinger 设置为 false 并指定零超时间隔,则 Close 会释放连接并自动丢弃传出排队数据。

建议关闭充其量是不必要的......