Ошибка отправки данных прослушивателя асинхронного сокета

Я создаю класс-оболочку вокруг класса Socket.

У меня есть обратный вызов асинхронного подключения, который делает это:

public void StartConnecting()
{
    // Connect to a remote device.
    try
    {
        //_acceptIncomingData = acceptIncomingData;

        // Create a TCP/IP socket.
        _workingSocket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);

        if (Information != null)
            Information(this, new InfoEventArgs("Connecting", "Working socket is initiating connection"));

        // Connect to the remote endpoint.
        _workingSocket.BeginConnect(_localEndPoint,
                new AsyncCallback(ConnectCallback), _workingSocket);
    }
    catch (Exception ex)
    {
        if (Error != null)
            Error(this, new ErrorEventArgs(ex.Message, ex));
    }
}

private void ConnectCallback(IAsyncResult ar)
{
    try
    {
        // Retrieve the socket from the state object.
        Socket client = (Socket)ar.AsyncState;

        // Complete the connection.
        client.EndConnect(ar);

        // ACTION CONNECTED COMPLETE
        if (Information != null)
            Information(this, new InfoEventArgs("Connected", "Working socket has now connected"));

        // Start Receiving on the socket

        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = client;

        // Begin receiving the data from the remote device.
        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReceiveCallback), state);
    }
    catch (Exception ex)
    {
        if (Error != null)
            Error(this, new ErrorEventArgs(ex.Message, ex));
    }
}

И для объекта состояния он использует предопределенный класс:

public class StateObject
{
    // Client  socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 1024;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    // Received data string.
    public StringBuilder sb = new StringBuilder();
}

Я использую это для подключения к сокету, который начал прослушивание, я называю этот прослушивающий сокет Server, и он использует класс Socket. Приведенный выше код представляет собой сокет, который я называю Client. Когда Client подключается к Server, Client теперь разрешено отправлять данные на Server. Однако, когда я хочу получить данные, отправленные из Server, я получаю следующее сообщение об ошибке:

Запрос на отправку или получение данных был отклонен, поскольку сокет не подключен и (при отправке на сокет дейтаграммы с помощью вызова sendto) не был указан адрес.

Что мне не хватает? или не правильно делаешь?

После того, как мне было предложено проверить, прослушивает ли Server, я посмотрел на то, что я называю WorkingSocket в моем классе-оболочке, который является используемым сокетом, я проверил это после успешного согласования Server listen/Client connect. Пишет, что сокет не подключен. Итак, мой вопрос сейчас:

Нужно ли Server (прослушивающий сокет) подключаться к Client для отправки данных, как это сделать, если у вас есть один Server для многих Client?


person Callum Linington    schedule 28.01.2013    source источник
comment
Вы можете подключиться к прослушивающей стороне с помощью telnet <address> <port>?   -  person Nikolai Fetissov    schedule 28.01.2013
comment
это отношения между сервером и клиентом пока что только на локальном компьютере, поэтому оба на 127.0.0.1 на порту 11000   -  person Callum Linington    schedule 28.01.2013
comment
Итак, вы можете связаться с telnet 127.0.0.1 11000? т.е. мой вопрос - ваш сервер слушает?   -  person Nikolai Fetissov    schedule 28.01.2013
comment
Как я сказал в посте, у меня есть класс-оболочка, я добавлю, что сервер и клиент находятся в одной форме cs. Я запускаю прослушивание сервера, нажав кнопку, затем подключаю клиента, нажав другую кнопку. Это означает, что теперь они должны быть подключены.   -  person Callum Linington    schedule 28.01.2013
comment
Это ваше предположение. Я прошу вас убедиться в этом.   -  person Nikolai Fetissov    schedule 28.01.2013
comment
Да это так. В ошибке указано, что сокет не подключен, что правда, поэтому мой вопрос несколько изменится, и я обновлю свой вопрос.   -  person Callum Linington    schedule 28.01.2013


Ответы (1)


Еще в январе у меня было непонимание того, как работают сокеты. Ошибка была вызвана тем, что я не понимал, что когда клиент подключается к сокету для прослушивания, сокет для прослушивания создает новый объект сокета, на который будут ссылаться все данные, отправленные и полученные от клиента.

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

person Callum Linington    schedule 12.03.2013