【问题标题】:Data transfer issues using network stream使用网络流的数据传输问题
【发布时间】:2014-03-27 18:53:31
【问题描述】:

我的代码有一个大问题。或与系统。这是 C# 中的客户端代码:

TcpClient client = new TcpClient("192.168.1.254", 19999);
NetworkStream nstream = client.GetStream();
Console.WriteLine("Connected.");
Stream stream = new FileStream("test.dat", FileMode.Create, FileAccess.Write);
int counter = 0;
byte[] buffer = new byte[1024];
while ((counter = nstream.Read(buffer, 0, 1024)) > 0)
{
    stream.Write(buffer, 0, counter);
}
stream.Close();
nstream.Close();
client.Close();
Console.WriteLine("Done here.");

此应用程序与服务器一起使用,用 python 编写。这里没有火箭科学。客户端连接,服务器立即循环发送数据,直到结束,套接字关闭。问题是,在我的机器上,这个应用程序总是在 5 - 7 kB 之后停止接收数据。它停止并且(如调试器所示)挂起读取方法。这只发生在我的机器上(来自 MSDN 的 Windows 7 x64、visual studio 2013 express、.net 4.5.1)。也在我的机器上测试了这个应用程序,但在 Linux、mono 和其他一些 Windows 机器上。它在任何地方都有效,但遗憾的是不在这里。我想这是我的系统的问题,所以这是我目前尝试过的:

  • 在没有调试器的情况下运行应用程序

  • 重新安装 Visual Studio

  • 重新安装 .NET 框架

  • 关闭 Windows 防火墙和 AV

  • 将目标框架更改为以前的版本(3、3.5)

很遗憾,无法重新安装操作系统。我必须在我的系统上完成这项工作,但我已经没有选择了。我什至不知道是什么导致了这个问题。我还能检查什么?

【问题讨论】:

  • 我没有看到明显的代码问题,但有建议:尝试用Stream.CopyTo() 替换缓冲区和复制代码,看看是否还有问题。其他需要检查的事项 - AV 软件是否有干扰?连接断开还是仍在连接(netstat)? Wireshark 显示了关于连接情况的哪些信息?

标签: c# sockets networking networkstream


【解决方案1】:

NetworkStream.Read 方法在没有可用字节的情况下调用时,将阻塞,直到有可用字节或连接关闭。因此,您最好选择 1)设计一个协议,让您提前知道有多少字节,然后在您读取那么多字节时停止读取,或者 2)在不活动超时后关闭连接。请注意,1) 是正确编码的唯一方法,2) 如果发生网络故障,将为您提供部分数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2011-06-18
    相关资源
    最近更新 更多