【问题标题】:Multiple clients with Server Application more than 15 clients handling issue具有服务器应用程序的多个客户端超过 15 个客户端处理问题
【发布时间】: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 而不是总数。
  • 正如彼得所说,这很可能是您的服务器代码中的错误;你能告诉我们一些关于服务器接受新连接的代码吗?

标签: c# .net sockets nms


【解决方案1】:

m_workerSocketPkt 数组(或m_workerSocket)增加到15 以上或将其转换为List<>。 (我猜是因为你没有显示它的声明)

【讨论】:

  • 我打算建议“在你的代码中搜索数字 15 并替换它”,但我认为这有点苛刻。本质上,我同意他的应用程序中的某些内容限制为 15 个。
【解决方案2】:

即使是最基本的 Windows XP 系统也应该能够处理 1000 个连接。 TCP 允许每台客户端机器有数千个连接。 (我不建议每台服务器超过 100K)

如果您的程序失败,则可能是您的代码中的错误。是否可能会产生您忽略的错误?你的程序会出现什么错误?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2011-06-03
    相关资源
    最近更新 更多