【发布时间】:2011-01-05 06:21:18
【问题描述】:
我有一个用 C# .NET 编写并在 Windows XP SP3 上运行的服务器应用程序。
我正在使用异步套接字编程来处理大约 500 个客户端。
但是我在处理超过 15 个客户端连接时遇到了问题。
在 15 个客户端后又有 1 个客户端连接时,我的应用程序被关闭;我不是 了解问题是我的操作系统还是 Windows XP 中的 tcp 连接限制问题。
请帮忙解决这个问题,请提出任何解决方案。
更新:
这是我的一段代码。
public const int MAX_CLIENTS = 200;
public AsyncCallback pfnWorkerCallBack;
private Socket[] m_workerSocket = new Socket[MAX_CLIENTS];
// class for worker socket & callback method & data buffer
private SocketPacket[] m_workerSocketPkt = new SocketPacket[MAX_CLIENTS];
// page Load
m_mainSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 4321);
// Bind to local IP Address...
m_mainSocket.Bind(ipLocal);
// Start listening...
m_mainSocket.Listen(MAX_CLIENTS);
m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
// called when client is connected
public void OnClientConnect(IAsyncResult asyn)
{
try
{
m_clientCount = setclient();
SocketPacket abc = new SocketPacket();
m_workerSocketPkt[m_clientCount] = abc; //assigning with SocketPacket class
m_workerSocketPkt[m_clientCount].m_currentSocket =
m_mainSocket.EndAccept(asyn); //transferring connection to other thread
m_workerSocketPkt[m_clientCount].m_clientCount = m_clientCount;
m_workerSocketPkt[m_clientCount].templist = abcde; //assigning Amj (list) class
m_workerSocket[m_clientCount] = m_workerSocketPkt[m_clientCount].m_currentSocket;
pfnWorkerCallBack = new AsyncCallback(m_workerSocketPkt[m_clientCount].OnDataReceived); //defining AsynCallBack function for the accepted socket
m_workerSocketPkt[m_clientCount].oldpfnWorkerCallBack = pfnWorkerCallBack;
m_workerSocketPkt[m_clientCount].data_rec = false;
m_workerSocketPkt[m_clientCount].data_sent = false;
m_workerSocketPkt[m_clientCount].m_currentSocket.BeginReceive(
m_workerSocketPkt[m_clientCount].dataBuffer, //assigning data buffer for receiving for the socket
0, //assigning data buffer offset for receiving for the socket
m_workerSocketPkt[m_clientCount].dataBuffer.Length, //assigning maximum data length for receiving for the socket
SocketFlags.None, //socket flags
pfnWorkerCallBack, //AysnCallBack delegate
m_workerSocketPkt[m_clientCount].m_currentSocket //state
);
m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null); //start invitation for other new sockets
}
这里的最大客户端值是 200 和工作套接字,所以它应该处理 200 个客户端,但我认为从超过 15 个客户端接收数据会产生问题,因为每个连接的客户端都是连续连接的,并将数据发送到服务器。
【问题讨论】:
-
错误信息?您可能已达到半开连接的许可限制,需要升级到 Windows Server。阅读此问题了解更多详情:serverfault.com/questions/51597/…
-
史蒂夫 - 恕我直言不太可能。半开连接限制适用于出站连接,而不是入站连接,问题是由于尝试新出站连接的 RATE 而不是总数。
-
正如彼得所说,这很可能是您的服务器代码中的错误;你能告诉我们一些关于服务器接受新连接的代码吗?