Несколько клиентов с серверным приложением, более 15 клиентов обрабатывают проблему - PullRequest
2 голосов
/ 05 января 2011

У меня есть серверное приложение, написанное на C # .NET и работающее под управлением Windows XP SP3.

Я использую асинхронное программирование сокетов для обработки около 500 клиентов.

Но у меня возникла проблема сРазвлекать более 15 клиентских подключений.

Мое приложение было закрыто, когда еще 1 клиент подключился после 15 клиентов;Я не понимаю, связана ли проблема с моей ОС или с проблемой ограничения tcp-соединения в Windows XP.

Пожалуйста, помогите решить эту проблему, предложите любое решение.

Обновление:

Вот мой кусок кода.

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 клиентов, поскольку каждый подключенный клиент постоянноподключен и отправляет данные на сервер.

Ответы [ 2 ]

1 голос
/ 21 января 2011

Увеличьте массив m_workerSocketPkt (или m_workerSocket) до более чем 15 или преобразуйте его в List<>.(Полагаю, так как вы не показали его декларацию)

0 голосов
/ 05 января 2011

Ваша даже самая простая система Windows XP должна поддерживать 1000 соединений.TCP позволяет тысячи соединений на клиентском компьютере.(Я бы не рекомендовал более 100K на сервер)

Если ваша программа дает сбой, вероятно, это ошибка в вашем коде.Возможно ли это, выдает ошибку, которую вы игнорируете?В чем заключается ошибка вашей программы?

...