我正在使用com2tcp隧道软件(在Windows 7上运行)连接到TCP服务器(用C语言编写,在嵌入式Linux平台上运行)。首先建立连接,客户端以500ms-1秒的间隔连续发送命令,同时获得响应,这意味着TCP客户端/服务器通信正常运行。
要了解问题是否与com2tcp隧道软件有关,我写了类似的东西,代码在这里(在C#中):
/* Connect to server */
client = new TcpClient(IpAddress, Port);
stream = client.GetStream();
/* Open virtual serial port */
port = new SerialPort(virt, 19200, Parity.None, 8, StopBits.One);
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
使用下面的代码(线程函数)将串行端口上的数据发送到TCP套接字。
SerialReadTCPSend()
{
Int32 ret = port.Read(buff2, 0, port.BytesToRead);
Console.Write("Serial Data, number of bytes: ");
Console.WriteLine(string.Format("{0}", ret));
Console.WriteLine(BitConverter.ToString(buff2, 0, ret));
stream.Write(buff2, 0, ret);
}
使用以下代码(线程函数)
将TCP套接字中接收的数据发送到串行端口TCPReceiveSerialWrite()
{
Int32 bytes = stream.Read(buff1, 0, client.Available);
Console.Write("TCP Data, number of bytes: ");
Console.WriteLine(string.Format("{0}", bytes));
Console.WriteLine(BitConverter.ToString(buff1, 0, bytes));
port.Write(buff1, 0, bytes);
}
现在的问题是;一段时间后(此时间是随机的)客户端软件停止读取tcp数据包(读取调用stream.Read
只是阻止),wireshark显示来自服务器的数据到达客户端并且来自客户端的命令由服务器接收(SerialReadTCPSend
工作正确而TCPReceiveSerialWrite
没有;它会阻止stream.Read
)。
此外,wireshark会在服务器发送的每个数据包中显示CRC错误(但客户端收到的数据与预期一致)。
请帮助我理解并调试此问题。