Грешка при изпращане на данни от приемника на Async Socket

Създавам клас обвивка около класа 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 слушане/Client преговаряне за свързване. Пише, че гнездото не е свързано. Та въпросът ми сега е:

Трябва ли 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