Timeout at AcceptSocket?
本文关键字:AcceptSocket at Timeout | 更新日期: 2023-09-27 18:37:20
是否可以AcceptSocket
超时的TcpListener
对象,以便偶尔中断它?
TcpListener server = new TcpListener(localIP, port);
server.Start();
while (!shuttingDown)
try
{
Socket client = server.AcceptSocket();
if (client != null)
{
// do client stuff
}
}
catch { }
尝试开始接受和结束接受:如果没有客户端,我该如何结束接受 3 秒?(我试图在这里近似解决方案)
server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server);
Thread.Sleep(3000);
server.EndAcceptTcpClient(???);
我创建了以下扩展方法作为接受超时参数的TcpListener.AcceptSocket的重载。
/// <summary>
/// Accepts a pending connection request.
/// </summary>
/// <param name="tcpListener"></param>
/// <param name="timeout"></param>
/// <param name="pollInterval"></param>
/// <exception cref="System.InvalidOperationException"></exception>
/// <exception cref="System.TimeoutException"></exception>
/// <returns></returns>
public static Socket AcceptSocket(this TcpListener tcpListener, TimeSpan timeout, int pollInterval=10)
{
var stopWatch = new Stopwatch();
stopWatch.Start();
while (stopWatch.Elapsed < timeout)
{
if (tcpListener.Pending())
return tcpListener.AcceptSocket();
Thread.Sleep(pollInterval);
}
throw new TimeoutException();
}
此代码检查是否有新客户端建立连接。如果是这样,则调用AcceptSocket()
。唯一的问题是服务器必须经常检查以快速响应客户端。
TcpListener server = new TcpListener(localIP, port);
server.Start();
while (!shuttingDown)
{
if (server.Pending())
{
Socket client = server.AcceptSocket();
if (client != null)
{
// do client stuff
}
}
else
Thread.Sleep(1000);
}
只需在侦听套接字上设置读取超时。这会导致accept()
以与读取超时相同的方式发生超时,无论 C# 中是什么。