从套接字接收数据-调试结束,代码挂起
本文关键字:结束 代码 挂起 调试 套接字 数据 | 更新日期: 2023-09-27 18:13:12
我遵循MSDN中关于c#套接字编程的示例。
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();
,调试就消失了,应用程序挂起。这里的问题是远程服务器仍在处理。当它完成时,它应该发送回一个响应。什么也不会发生。
由于我没有socket编码经验,我想知道是否有人遇到过这种情况。如果是,我该如何解决这个问题,这样我才能得到响应,而应用程序不会挂起?
更新:
我真想打自己的头。问题不在于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);
这将工作,一切继续。我需要确保响应没有被切断。但是那样就会违背异步客户机的目的,对吗?嗯…再次感谢大家的意见。
OK。我知道我是怎么做错的之后才明白的。我没有检查最后的回复。我假设缓冲区传输的结束将触发返回响应的方法。
谢谢大家的帮助。没有你的帮助,我是不可能想出解决办法的。干杯!