我是一名dotnet propgrammer。最近我写了一个aclient服务器应用程序,它使用system.net.sockets进行连接,并检查客户端是否有一个定时器,客户端发送byte.minvalue来检查alive。当客户端断开连接时我关闭套接字并关闭它。这项工作很好,但当客户端数量增加时无法建立连接并出现问题。我使用2000积压的积压但不能正常工作? 帮我!
答案 0 :(得分:1)
这是非常模糊的,一些更详细的信息(您在客户端和/或服务器上获得的错误)或某些代码(您如何接受服务器上的连接?)可能有所帮助。
与此同时,我会随便猜一下......
如果您正在快速创建和销毁来自客户端的连接,并且您通过在同一台计算机上运行大量客户端来测试服务器,则可能会因TIME_WAIT
而导致套接字耗尽。同样,如果您通过从同一台Windows计算机创建大量客户端连接(通常超过4000)来测试服务器,那么您可能会遇到默认的MAX_USER_PORT
设置,严重限制了您的并发出站连接数可以一次制作。
答案 1 :(得分:0)
为什么在调用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();
}
}
答案 2 :(得分:0)
客户连接/断开的速度有多快? TCP套接字不会立即关闭,它们会进入TIME_WAIT状态并暂停一段时间(我认为Windows上的默认值是120秒)。这可能导致所有套接字正在使用,并且新连接被拒绝。
MSDN信息:http://msdn.microsoft.com/en-us/library/ms819739.aspx
在服务器上输入:
netstat -a
如果你有大量的TIME_WAIT连接,那么你需要减少关闭套接字的时间。