Я следовал примеру в 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);
Это сработает, и все будет продолжаться. Мне нужно убедиться, что ответ не прерывается. Но тогда это разрушит цель этого асинхронного клиента, верно? Хм.... еще раз спасибо всем за участие.