【问题标题】:TCPClient not reading the incoming dataTCPClient 未读取传入数据
【发布时间】:2011-09-04 16:43:38
【问题描述】:

我正在开发一个 C# 应用程序,它通过 TCP/IP 连接到主机以发送然后使用 TCPClient Stream 接收响应。

问题是我可以使用 Stream.Write(...) 发送数据,但是当我尝试通过调用 Stream.Read(...) 来获取对我发送数据的响应时,它挂起并且永远不会返回。

我检查了像 Wire-Shark 这样的网络嗅探工具,可以看到我的网络接口正在接收来自主机的数据。为什么我的 TCPClient 没有读取这些数据?

WireShark显示的接收数据的Hex转储以00开头,是否表示Null字符,造成TCPClient读取问题?

00-1d-4f-fb-43-4b-00-1d-7e-3a-9a-20-08-00-45-00-00-34

这是编写代码...

myTcpClient = new TcpClient();
myTcpClient.Connect("192.168.0.194", 1958);
Stream myTCPStream = myTcpClient.GetStream();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] msgBytes = asen.GetBytes("Message to be sent.");
myTCPStream.Write(msgBytes, 0, msgBytes.Length);

这就是阅读的代码......

byte[] bytesReceived = new byte[100];
int nBytesRead = myTCPStream.Read(bytesReceived, 0, bytesReceived.Length);
myTcpClient.Close();

感谢您的帮助。

【问题讨论】:

  • 我的魔法水晶球还需要修理,所以我担心你必须同时向我们展示代码......
  • 我也面临类似的问题。尝试将 NoDelay 设置为 true 但没有运气。 Wireshark 清楚地显示服务器已发送此数据,但网络流无法读取它。 HTTP/1.1 200 已建立连接\r\n

标签: c# stream tcpclient wireshark


【解决方案1】:

这可能是时间问题,但是如果没有看到你的代码就很难说(你是在发送数据包后直接运行读取代码吗?它在同一个线程上吗?)

另一个想法:尝试将NoDelay 属性设置为true。这告诉 TCP 堆栈立即将数据传递给您的应用程序,而不是等待一个完整的缓冲区(禁用 Nagle algorithm)。这对于减少发送和接收小数据包时的延迟很有用。

【讨论】:

  • 是的,我在发送同一个线程后正在阅读。 Wireshark 捕获的数据为 54 字节,从 0x00 开始。是某种 Ack 吗???
  • 数据将是服务器应用程序在接收到新连接时发回的任何数据——它看起来像是某种二进制协议。发布您的 Wireshark 日志可能会有所帮助
猜你喜欢
  • 2012-01-22
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多