Получить данные из сокета - отладка ушла, а код зависает

Я следовал примеру в MSDN о программировании сокетов С#.

 private static void StartClient() {
// Connect to a remote device.
try {
// Establish the remote endpoint for the socket.
// The name of the
// remote device is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

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

// Connect to the remote endpoint.
client.BeginConnect( remoteEP,
new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();

// Send test data to the remote device.
Send(client,"This is a test<EOF>");
sendDone.WaitOne();

// Receive the response from the remote device.
Receive(client);
receiveDone.WaitOne();

// Write the response to the console.
Console.WriteLine("Response received : {0}", response);

// Release the socket.
client.Shutdown(SocketShutdown.Both);
client.Close();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}

Я создал простое тестовое приложение, которое работает. Приложение отправляет и получает ответ почти мгновенно.

Итак, теперь задача состоит в том, чтобы реализовать решение, в котором сокет подключается к внешнему устройству, которое будет обрабатывать информацию из сокета, а затем отправлять ответ. В строке «Отправить тестовые данные на удаленное устройство» --> устройство получает эту информацию в процессах.

Отладка продолжается. Процесс все еще продолжается на удаленном устройстве, потому что я вижу, как данные удаляются.

Но как только он доходит до receiveDone.WaitOne();, отладка исчезает, и приложение зависает. Проблема здесь в том, что удаленный сервер все еще обрабатывает. Когда это будет сделано, он должен отправить ответ. Ничего не произошло.

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


Обновлять:

Мне хочется ударить себя по голове. Проблема не в методе WaitOne(). Отладка исчезла из WaitOne(), потому что она ожидает ответа. Когда приходит ответ, он переходит к Receive(), который затем вызывает ReceiveCallback().

 private void Receive(Socket client)
    {
        try
        {
            // 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);

            //THIS IS WHERE THE CODE DOESN'T CONTINUE.
        }
        catch (Exception e)
        {
            string error = e.InnerException.ToString();
        }
    }

Когда ReceiveCallback() завершается и получает все данные, он останавливается. Он не возвращается к моему коду, где я инициирую отправку и получение данных.

Он должен идти: 1. Получить строку запроса на ввод 2. Передать ее коду сокета 3. Код сокета отправляет строку запроса на ввод 4. Код сокета получает строку ответа 5. Взять строку ответа и что-то с ней сделать

Таким образом, он останавливается на # 4 и заканчивается, не выполняя все шаги. Мне не хватает кода для продолжения потока? Или я неправильно настроил процесс?

Спасибо еще раз за помощь. @John - спасибо за обновление моего заголовка. Постараюсь запомнить название на будущее.

========================================

ОБНОВЛЕНИЕ 2: если я изменю код и не буду использовать Receive(), как в образце MSDN, образец ссылки MSDN и выполните что-то вроде:

            var response = client.Receive(buffer);

            var message = Encoding.ASCII.GetString(buffer);

Это сработает, и все будет продолжаться. Мне нужно убедиться, что ответ не прерывается. Но тогда это разрушит цель этого асинхронного клиента, верно? Хм.... еще раз спасибо всем за участие.


person Mike Stone    schedule 16.07.2014    source источник
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 16.07.2014


Ответы (1)


OK. Я понял это после того, как увидел, как я ошибся. Конечный ответ не проверял. Я предполагал, что окончание передачи буфера приведет к срабатыванию метода, возвращающего ответ.

Спасибо всем за вашу помощь. Я не смог бы прийти к решению без вашей помощи. ваше здоровье!

person Mike Stone    schedule 16.07.2014