我是套接字编程的新手。我有一个用C#编写的小应用程序,它使用COM端口连接到"密钥映射器"设备仅在应用程序发送匹配命令时才响应。例如:如果我需要从映射器获取一些引脚号,我发送了一个十六进制命令。然后我收到了正确的回复。现在,我尝试使用具有设备唯一IP地址的套接字连接执行相同的活动,如下所示。
private void button1_Click(object sender, EventArgs e)
{
byte[] sendCommand = new byte[] { 0x02, 0x24, 0x31, 0x95, 0x0A, 0x0D, 0x03 };
byte[] ReceivedVal = new byte[1024];
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.178.170"), 10001);
Socket senderNew = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
waitLoop(5);
try
{
senderNew.Connect(ipEndPoint);
}
catch(SocketException socProblem)
{
Console.WriteLine(socProblem.Message.ToString());
}
waitLoop(5);
int test = senderNew.Receive(ReceivedVal);
Console.Write("Starting bytes read : ");
Console.WriteLine(test.ToString());
waitLoop(5);
int bytesSent = senderNew.Send(sendCommand);
waitLoop(5);
Console.WriteLine("Socket connected to {0}", senderNew.RemoteEndPoint.ToString());
int bytesRec = senderNew.Receive(ReceivedVal);
Console.Write("data bytes read : ");
Console.WriteLine(bytesRec.ToString());
waitLoop(5);
QueryAllCodeResponseHandler(ReceivedVal);
waitLoop(5);
Console.Write("Number of Pin Codes read: ");
Console.WriteLine(PinCodes.Length.ToString());
senderNew.Close();
GC.Collect();
PinCodes = null;
ReceivedVal = null;
ipEndPoint = null;
GC.Collect();
}
预期结果如下:
当我逐行调试时,它完全正常。但如果我直接运行它没有任何调试点或逐行跳过调试我只得到2个引脚或0个引脚。然后我尝试在尝试失败之后使用第三方应用程序写入,并意识到它从先前的尝试接收了其余的引脚。有人可以帮助我找出问题所在吗?
答案 0 :(得分:2)
正如已经指出的那样,您的代码会留下一些问题,但(假设您的调试步骤是准确的)似乎您只是依靠TCP协议来决定何时收到您的回复。
您要连接的设备应使用应用程序定义的协议来查询它。例如,初始响应将包含整个响应期望的字节数,或者它将使用特定字符来指示响应的结束,有无限的方式。
正确的实现将遍历几个receive(),直到数据被完全接收(或超时到期)。
换句话说,设备似乎发送的数据比你想象的要慢得多,而且直接运行(没有调试停止)只能捕获部分响应。