【问题标题】:TCP transfer file works when server&client are running on 1 PC but corrupts when running on 2当服务器和客户端在 1 台 PC 上运行时 TCP 传输文件有效,但在 2 台 PC 上运行时损坏
【发布时间】:2015-09-28 11:10:48
【问题描述】:

所以我正在尝试制作一个程序,它将我想从我的主 PC 中的客户端打印的文件发送到运行服务器并连接到打印机的第二台 PC。 当我测试我的代码时,我在我的主电脑上运行了客户端和服务器,它运行良好。但是,当我在我的主 PC 上运行客户端并在我的第二台 PC 上运行服务器时,文件已损坏,我不知道为什么。

这是我的Listener(我删除了我认为不必要的部分):

void Listener()
{
    //All of these strings and bools are filled correctly I just removed it because its long
    string file="";
    string size = "";
    bool print;

    Socket server = myList.AcceptSocket();

    var output = File.Create(file);
    Console.WriteLine("Client connected. Starting to receive the file");

    int k = 0;
    int read = 0;
    byte[] buffer = new byte[long.Parse(size)];
    NetworkStream stm = new NetworkStream(server);

    while ((k = stm.Read(buffer, 0, buffer.Length-read)) > 0)
    {
        read += k;
    }
    output.Write(buffer, 0, buffer.Length);

    output.Close();
    if (print) { PrintFile(file); }
    server.Close();
    Thread.CurrentThread.Abort();            
}

这是客户端代码(我删除了我认为不必要的部分):

void startClient()
{
    FileInfo f = new FileInfo(file);
    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    client.Connect(IPAddress.Parse("10.0.0.13"), 27015);
    Console.WriteLine("Connected");
    byte[] bytes = File.ReadAllBytes(file);
    client.SendFile(file);
    Console.WriteLine("File Sent");
    client.Close();
}

有人知道如何解决这个问题吗?提前致谢!

【问题讨论】:

  • 是有错误还是客户端只是未连接?你确定ip和端口是对的吗?也许您可以使用 DNS 而不是 ip。见stackoverflow.com/questions/14838421/…
  • @LaMiy 根本不相关。 OP提到连接很好,只是文件损坏了。

标签: c# sockets networking tcp corruption


【解决方案1】:

您不会将read 偏移量应用于缓冲区,在每次NetworkStream.Read() 调用时从索引0 开始写入。在本地或使用较小文件进行测试时,这将正常工作,因为所有内容都将在一个 Read() 中到达。在真实网络上或处理较大文件时,您会发现需要多次调用Read() 才能读取所有数据。

所以改成:

stm.Read(buffer, read, buffer.Length-read)

您可能还想重新考虑一次读取内存中的整个文件。您可能希望同时将其写入磁盘,特别是因为分配大型数组可能导致OutOfMemoryException 比您预期的要早。

还可以考虑使用现有的网络协议,而不是使用自己的协议。除了这个非常基本的问题,您还容易遇到许多其他常见的套接字陷阱。

【讨论】:

  • 哇,成功了,谢谢!我对网络真的很陌生,所以这些东西对我来说有点难,但我愿意花时间学习它。再次感谢!
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多