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

C# TCP通信接收异常数据问题:发送与接收数据不符

C# TCP通信发送指定字符串却收到异常数据的原因分析

咱们直接戳代码里的问题,这是TCP开发新手常踩的坑:

核心问题:服务端未按实际接收字节数解析数据

你服务端这段代码就是异常的根源:

int x = socket.ReceiveBufferSize;
byte[] buffor = new byte[x];
int data = socket.Receive(buffor);
string wiadomość = Encoding.ASCII.GetString(buffor);

ReceiveBufferSize是操作系统给Socket分配的缓冲区总容量,它通常远大于你实际发送的字符串字节数。当你直接把整个buffor转成字符串时,会把缓冲区里未被数据填充的空字节(\0)也一并转译,这就导致你看到的"异常数据"——比如正常字符串后面跟着一堆空白或乱码。

正确的做法是用Receive返回的data值(实际接收到的字节数)截取有效数据:

string wiadomość = Encoding.ASCII.GetString(buffor, 0, data);

额外注意:TCP的流式特性

TCP是流式协议,Receive方法不一定能一次性拿到所有发送的数据(比如数据量较大时,会被拆分成多个TCP段传输)。如果后续你要发送更长的内容,需要循环调用Receive,直到确认拿到完整消息——比如可以利用你代码里的$作为分隔符,或者约定消息开头带长度标识来判断接收完成。

小细节优化

客户端里的变量名hasło带特殊字符,虽然C#语法允许,但建议换成英文命名(比如password),避免编码或团队协作时的潜在问题。

修正后的服务端关键代码示例:

try {
 string msg = "";
 Socket socket = Listerner.AcceptSocket();
 byte[] buffor = new byte[1024]; // 用一个合理的固定大小,按需调整
 int data = socket.Receive(buffor);
 string wiadomość = Encoding.ASCII.GetString(buffor, 0, data);
 // 这里就能拿到正确的字符串了
}

内容的提问来源于stack exchange,提问作者Mariusz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:59:05