【发布时间】:2009-12-28 15:45:23
【问题描述】:
我是一名 dotnet 程序员。最近我编写了一个客户端服务器应用程序,它使用 system.net.sockets 进行连接并检查客户端是否打开,客户端发送 byte.minvalue 以检查是否存活。当客户端断开连接时,我关闭套接字并关闭它。这工作正常,但是当客户端数量增加时无法建立连接并出现问题。我使用 2000 值的积压但不能正常工作? 帮我!
【问题讨论】:
我是一名 dotnet 程序员。最近我编写了一个客户端服务器应用程序,它使用 system.net.sockets 进行连接并检查客户端是否打开,客户端发送 byte.minvalue 以检查是否存活。当客户端断开连接时,我关闭套接字并关闭它。这工作正常,但是当客户端数量增加时无法建立连接并出现问题。我使用 2000 值的积压但不能正常工作? 帮我!
【问题讨论】:
这很模糊,一些更详细的信息(您在客户端和/或服务器上遇到的错误)或一些代码(您如何接受服务器上的连接?)可能会有所帮助。
与此同时,我会随机猜测你......
如果您正在快速创建和销毁来自客户端的连接,并且您正在通过在同一台机器上运行大量客户端来测试您的服务器,那么您可能会因为TIME_WAIT 而遇到套接字不足的问题。同样,如果您通过从同一台 Windows 计算机创建大量客户端连接(通常超过 4000 个)来测试服务器,那么您可能会遇到默认的 MAX_USER_PORT 设置,这严重限制了您可以进行的并发出站连接的数量一次。
【讨论】:
为什么在调用 OnClientAccept 时要锁定?这是一个瓶颈。
如果您需要锁,请在 OnClientAccept 中进行更细粒度的操作。
还有。切换到 BeginAccept/EndAccept 以提高速度。
internal class SocketServer
{
private readonly IPAddress _address;
private readonly int _port;
private TcpListener _listener;
public SocketServer(IPAddress address, int port)
{
_address = address;
_port = port;
}
public void Start(int backlog)
{
if (_listener != null)
return;
_listener = new TcpListener(_address, _port);
_listener.Start(backlog);
_listener.BeginAcceptSocket(OnAccept, null);
}
private void OnAccept(IAsyncResult ar)
{
TcpClient client = null;
try
{
client = _listener.EndAcceptTcpClient(ar);
}
catch(Exception err)
{
// log here. Eat all exceptions so the server will not die.
// i usually have a ExceptionThrown event to let other code
// debug asynchrounous exceptions.
}
// Begin to accept clients asap
try
{
_listener.BeginAcceptTcpClient(OnAccept, null);
}
catch(Exception)
{
// read above exception comment.
}
// this accept failed, lets not do anything with the client.
if (client == null)
return;
try
{
OnClientAccepted(client);
}
catch(Exception)
{
// read above exception comment.
}
}
private void OnClientAccepted(TcpClient client)
{
throw new NotImplementedException();
}
}
【讨论】:
客户端连接/断开连接的速度有多快? TCP 套接字不会立即关闭,它们会进入 TIME_WAIT 状态并停留一段时间(我认为 Windows 上的默认值是 120 秒)。这可能会导致所有套接字都在使用中并且新连接被拒绝。
此处为 MSDN 信息:http://msdn.microsoft.com/en-us/library/ms819739.aspx
关于服务器类型:
netstat -a
如果您有大量 TIME_WAIT 连接,那么您需要减少关闭的套接字挂起的时间。
【讨论】: