Socket编程 关于缓冲区长度问题
2014-04-28 20:26
344 查看
先描述问题的情景:系统的组成是客户端--代理服务器--服务器
问题:客户端向代理服务器发送登录请求,代理服务器向服务器转发客户端的登陆请求。问题出现在代理服务器接收消息,并且转发成功后没有收到服务器的登陆结果。
并且在输出登陆请求的时候,字符串是正常的。
后来经过讨论,问题出在代理服务器的转发请求上。
下面直接上解决办法:
//代理服务器接收数据方法
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);
}
}
问题:客户端向代理服务器发送登录请求,代理服务器向服务器转发客户端的登陆请求。问题出现在代理服务器接收消息,并且转发成功后没有收到服务器的登陆结果。
并且在输出登陆请求的时候,字符串是正常的。
后来经过讨论,问题出在代理服务器的转发请求上。
下面直接上解决办法:
//代理服务器接收数据方法
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);
}
}
相关文章推荐
- 关于socket编程的一个常坑问题,readLine()
- LWIP UDP socket编程 可以指定本地端口号及发送长度不能太长问题分析
- 关于udp socket recvfrom函数的一个易错问题: 如果应用程序指定的接收长度不够怎么办?
- 关于socket短链接和长链接在编程时要注意问题
- 关于SOCKET编程里面udp编程sendto和recvfrom的问题
- Android中的socket编程-关于设置连接的ip问题
- 网络编程中的socket中关于TCP下的文件传输:EOF问题
- 关于socket编程中的accept问题
- 关于SOCKET编程中“烫烫烫...”的问题
- 一个关于UDP socket服务端接收长度不正确的问题
- LWIP UDP socket编程 可以指定本地端口号及发送长度不能太长问题分析
- [原]关于socket编程中重用socket问题的备忘
- 关于宽字符(_UNICODE||UNICODE)和windows套接(socket)字编程问题
- 关于Android Socket编程遇到的问题
- 关于php socket编程中遇到的一些问题
- 关于java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度问题
- 关于linux下网络编程socket 转换IP问题 inet_ntoa()
- 关于socket编程中服务器端如何检测客户端连接断开的问题
- 关于socket编程的一些问题
- 问一个关于java Socket编程的问题。