2

我有一个用 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 个客户端接收数据时产生了问题,因为每个连接的客户端都是连续连接的并将数据发送到服务器。

4

2 回答 2

1

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

于 2011-01-21T11:47:06.253 回答
0

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

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

于 2011-01-05T07:35:41.067 回答