C#套接字编程:如何设置超时
我继承了一段显然糟糕的代码,无论是在语法、逻辑,还是在知识层面。我得假设下面的代码也很糟,因为出自同一个开发者,但我并不是一个套接字方面的专家,所以我想理解为什么要这样写。应该用不同的方式来实现吗?
_socket 下面来自于 TcpListener.AcceptSocket(),紧接着就调用了这个函数。这里有太多让我困惑的地方。
首先,为什么要设置 Blocking = true?难道一旦套接字被接受,它就不再阻塞了吗?
归根结底,我想要这样做:给套接字X 秒来完成任务,到了时间点就超时。我知道客户端已经为此设定了超时,但在服务器端,我也知道超时有助于防止套接字耗尽。
下面的代码在设置这个方面是否算接近正确?没有接收超时。这段代码都非常奇怪,和我需要梳理的其他工作一样。
public void ConfigureSocket()
{
int timeout = 500; // in milliseconds
_socket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.SendTimeout, timeout );
_socket.Blocking = true;
_socket.SendTimeout = 1000;
_socket.SendBufferSize = 8192;
_socket.LingerState = new LingerOption( true, 10 );
}
解决方案
是的,这段代码一点也不怎么样。我猜测现在使用的是同步的 Send 和 Receive,无论如何应该改成异步调用。异步调用有自己的取消令牌,你不应该直接把它设置在套接字上。
_socket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.SendTimeout, timeout );
这等同于调用:
_socket.SendTimeout = 1000;
在后面的实现中,这两个调用会冲突。文档中写道:“此选项仅适用于同步的Send调用。”你无论如何都应该使用异步代码。
_socket.Blocking = true;
再次强调“Blocking属性对异步方法无效”,所以在那种情况下它不起作用。即使在同步模式下,TCP套接字也会阻塞。
_socket.SendBufferSize = 8192;
为什么要去折腾这个?Windows可以分配动态缓冲区,远比你能做到的要好得多 更好 。
_socket.LingerState = new LingerOption( true, 10 );
默认行为 是:
优雅关闭,立即返回——允许关闭序列在后台完成。尽管这是默认行为,应用程序无法知道优雅关闭序列究竟何时完成(或是否完成)。
在大多数情况下,不需要设置Linger选项。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。