You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一PC上C#/.NET客户端向服务器传文件遇异常求助

解决C# .NET客户端-服务器传输文件时的连接强制关闭问题

这种问题我之前做Socket文件传输的时候踩过好几次坑,字符串短的时候因为数据量小,TCP的流式特性没暴露问题,但1KB的文件刚好触发了协议逻辑上的漏洞。下面是几个最常见的原因和对应的解决办法:

1. 未明确数据边界,接收端无法判断传输何时结束

Socket是流式传输,它不会帮你划分消息边界——也就是说,接收端不知道你发的文件到底有多长,可能还在等待后续数据的时候,发送端已经关闭了连接,直接导致“连接被强制关闭”的错误。

解决思路是先发送数据长度,再发送文件内容:

  • 发送端:先把文件转换成字节数组,然后将数组的长度(用Int32类型,占4字节)先发送给接收端,再发送文件的字节数据。
  • 接收端:先读取4字节转换成数据长度,再根据这个长度循环读取,直到接收完所有字节。

示例代码

发送端(核心逻辑)

byte[] fileBytes = File.ReadAllBytes("test.txt");
// 先发送数据长度(4字节)
byte[] lengthBytes = BitConverter.GetBytes(fileBytes.Length);
socket.Send(lengthBytes);
// 循环发送文件内容(确保所有字节都发出去)
int bytesSent = 0;
while (bytesSent < fileBytes.Length)
{
    int sent = socket.Send(fileBytes, bytesSent, fileBytes.Length - bytesSent, SocketFlags.None);
    if (sent == 0)
        throw new IOException("连接已断开");
    bytesSent += sent;
}

接收端(核心逻辑)

// 先读取长度
byte[] lengthBuffer = new byte[4];
int bytesRead = socket.Receive(lengthBuffer);
if (bytesRead != 4)
    throw new IOException("无法获取数据长度");
int fileLength = BitConverter.ToInt32(lengthBuffer, 0);

// 循环读取文件内容
byte[] fileBytes = new byte[fileLength];
int totalRead = 0;
while (totalRead < fileLength)
{
    int read = socket.Receive(fileBytes, totalRead, fileLength - totalRead, SocketFlags.None);
    if (read == 0)
        throw new IOException("连接被远程主机强制关闭");
    totalRead += read;
}
// 保存文件
File.WriteAllBytes("received.txt", fileBytes);

2. 发送端过早关闭Socket,导致未完成的传输中断

如果发送完文件后直接调用socket.Close(),TCP缓冲区里可能还有未发送完的数据,这时候关闭连接会直接中断传输,接收端就会收到“连接被强制关闭”的异常。

解决办法是先调用Shutdown告知对方不再发送数据,等待接收端确认后再关闭:

// 发送完所有数据后
socket.Shutdown(SocketShutdown.Send);
// 可以等待接收端的响应(如果有需要),或者等待缓冲区排空
socket.Receive(new byte[1], 0, 0); // 等待对方关闭连接的信号
socket.Close();

3. 接收端读取逻辑不完整,提前终止连接

如果接收端错误地认为一次Receive就能读完所有数据,当文件长度超过缓冲区大小时,会只读取部分数据就处理,后续再读取时就会因为连接已经被发送端关闭而报错。

这种情况要确保接收端是循环读取直到获取到指定长度的所有数据,就像上面示例里的接收端逻辑那样,不要依赖单次Receive返回完整数据。

总结

核心问题就是TCP的流式特性——它不像UDP有报文边界,所以必须自己定义传输协议(比如先传长度再传内容),同时确保发送和接收的逻辑完全匹配,不要假设数据会一次性发送/接收完成。

内容的提问来源于stack exchange,提问作者pp-man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:12:32