Socket编程 关于缓冲区长度问题

本文探讨了一种Socket编程中的问题,即代理服务器在转发客户端登录请求时,由于固定缓冲区长度(1024字节)导致接收到的服务器响应包含无意义字符。解决方案在于调整缓冲区大小,确保只处理实际消息长度,从而避免无效数据。通过修改接收和发送方法,成功解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先描述问题的情景:系统的组成是客户端--代理服务器--服务器

问题:客户端向代理服务器发送登录请求,代理服务器向服务器转发客户端的登陆请求。问题出现在代理服务器接收消息,并且转发成功后没有收到服务器的登陆结果。

           并且在输出登陆请求的时候,字符串是正常的。

后来经过讨论,问题出在代理服务器的转发请求上。

下面直接上解决办法:

 

        //代理服务器接收数据方法
        private void ServerGetMessage(object socket)
        {
            Socket s = (Socket)socket;
            while (true)
            {
                    Byte[] result = new Byte[1024];//注意这里,申请到的缓冲区长度是1024.所以之后转发的消息长度也是1024,这就意味着在少于1024字节的消息中会出现无意义字符
                    int msgLength=s.Receive(result);//获取到我们的消息长度
                    textBox1.AppendText("\r\n" + s.RemoteEndPoint.ToString() + "   " + "as server:" + ASCIIEncoding.ASCII.GetString(result));
                    lSocket[s].Send(ASCIIEncoding.ASCII.GetBytes(ASCIIEncoding.ASCII.GetString(result).Substring(0, msgLength)));
                    Console.WriteLine(lSocket[s].RemoteEndPoint.ToString());
                    Console.WriteLine(ASCIIEncoding.ASCII.GetBytes(ASCIIEncoding.ASCII.GetString(result).Substring(0, msgLength)).Length + "aa" + ASCIIEncoding.ASCII.GetString(result).Substring(0, msgLength));//这里只要获取到我们需要的字符串长度就行了
                    //Data data = new Data();
                    //data.msg = ASCIIEncoding.ASCII.GetString(result);
                    //data.s = s;
                    //JsonDecode jd = new JsonDecode(ASCIIEncoding.ASCII.GetString(result));
                    //Thread thread = new Thread(ServerMsgMethod);
                    //thread.Start(data);
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值