C # асинхронный сервер сокетов - PullRequest
0 голосов
/ 04 мая 2011

пишу асинхронный сокет сервер. Я посылаю пользователям разные типы данных на двух портах. Но как я могу продолжать получать данные от пользователя? Вот мой код:

 public void SendData(ConnectionInfo client, byte[] toUser, byte[] toAllUsers)
    {
        int userSize = toUser.Length < Settings.bufferLength ? toUser.Length : Settings.bufferLength;
        int allUsersSize = toAllUsers.Length < Settings.bufferLength ? toAllUsers.Length : Settings.bufferLength;
        try
        {
            lock (_connections)
            {

                    foreach (ConnectionInfo conn in _connections)
                    {
                        if (client.Socket != conn.Socket)
                        {
                            conn.Buffer = toAllUsers;
                            conn.SocketComamnd.BeginSend(conn.Buffer, 0, allUsersSize, SocketFlags.None,
                                                            new AsyncCallback(SendCallbackToAll), conn);
                        }
                        else
                        {
                            conn.Buffer = toUser;
                            conn.Socket.BeginSend(conn.Buffer, 0, userSize, SocketFlags.None,
                                                  new AsyncCallback(SendCallbackToUser), conn);
                        }
                    }

            }
            _receiveDone.Reset();
            _receiveDone.WaitOne(); // wait while socket send all data;
            Recieve(client);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

 public void Recieve(ConnectionInfo connection)
    {
        try
        {
            connection.Buffer = new byte[Settings.bufferLength];
            connection.FullBuffer.Clear();
            connection.NumberBytesSent = 0;

            _receiveDone.Reset();
            connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, 0,
                                           new AsyncCallback(RecieveCallback), connection);
            _receiveDone.WaitOne();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

    }

 private void SendCallbackToUser(IAsyncResult asyncResult)
    {
        try
        {
            ConnectionInfo connection = (ConnectionInfo)asyncResult.AsyncState;
            connection.NumberBytesSent += connection.Socket.EndSend(asyncResult);

            if (connection.NumberBytesSent < connection.Buffer.Length)
            {
                int size = (connection.Buffer.Length - connection.NumberBytesSent) < Settings.bufferLength ?
                           (connection.Buffer.Length - connection.NumberBytesSent) : Settings.bufferLength;

                Console.WriteLine("Bytes sent " + connection.NumberBytesSent);
                connection.Socket.BeginSend(connection.Buffer, connection.NumberBytesSent, size, SocketFlags.None,
                                                                new AsyncCallback(SendCallbackToUser), connection);
            }
            else if (connection.NumberBytesSent == connection.Buffer.Length)
            {
                Console.WriteLine("All - Bytes - sent to User := " + connection.NumberBytesSent);
                _receiveDone.Set(); // socket sent all data and allowed to receive data again;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

Метод SendCallbackToAll имеет ту же структуру, что и метод SendCallbackToUser. Я пытаюсь вызвать метод BeginReceive, но он запустится до завершения SendCallbackToUser.

Во-первых: я принимаю сокет на два порта. Первый порт предназначен для получения данных от клиента. Второй порт отправляет данные всем пользователям, а первый отправляет данные пользователю. Второе: я вызываю некоторые методы в своем приложении. Третье: тогда я вызываю метод SendData. Здесь я отправляю данные всем пользователям и отвечаю пользователю. Последнее: я вызываю метод Receive для получения данных от пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...