C#编程遇到一个奇怪问题

在梅边 2013-01-21 04:20:13
try
{
clientSocket.Receive(inBuffer, 10, SocketFlags.None);
int backlen = Int32.Parse(Encoding.GetEncoding("GBK").GetString(inBuffer));
MessageBox.Show("接收字符长度为"+backlen.ToString());

clientSocket.Receive(inBuffer, 40, SocketFlags.None);
inBuffer = new Byte[20000];
List<byte> getbyte = new List<byte>();
while (clientSocket.Receive(inBuffer, backlen-40, SocketFlags.None) > 0)
{
getbyte.AddRange(inBuffer);
}
byte[] getbuff = getbyte.ToArray();

richTextBox2.Text = DecryptDES(getbuff, textBox3.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

代码如上,此段代码是要接受socket,数据流的规则是前10个字符为报文的整个长度(算上40个空格),后40个字符为空格,然后是数据包(密文)

以上代码的作用就是解密,但是很奇怪的是,
MessageBox.Show("接收字符长度为"+backlen.ToString());
这句代码影响着解密的成败,如果有这句,解密就会成功,如果没有,解密会成功一半,如下图


请高人解答,本人C#水平实在是没法解决这个问题
...全文
161 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
while ( clientSocket.Available > 0 ) { clientSocket.Receive(inBuffer, backlen-40, SocketFlags.None) getbyte.AddRange(inBuffer); }
_周星星 2013-02-04
  • 打赏
  • 举报
回复
循环去读 直到读完
_周星星 2013-02-04
  • 打赏
  • 举报
回复
//读取服务器端返回来的消息 public static String getJsonFromServer() { byte[] data = null; String backJson = null; try { Debug.WriteLine(client.Connected + "连接否"); networkStream = client.GetStream(); int len = getJsonLen(); data = new byte[len]; int index = 0; int readLength = 0; while (index < len) { try { readLength = networkStream.Read(data, index, len - index); } catch (Exception ee) { Debug.WriteLine("Client getJsonFromServer()","read readLength is error "+ee.Message); } if (readLength > Number.COMPARE_ZERO) { index = index + readLength; } else { break; } } networkStream.Flush(); backJson = Encoding.UTF8.GetString(data); Debug.WriteLine(backJson); } catch (Exception ee) { Log.writeLog("Client getJsonFromServer()", App.Current.FindResource("Get_Json").ToString()+ee.Message); } return backJson; } //获得字符串的长度 private static int getJsonLen() { byte[] lengthdata = new byte[4]; for (int i = 0; i < 4; i++) { lengthdata[3 - i] = (byte)networkStream.ReadByte(); } int len = BitConverter.ToInt32(lengthdata, 0); if (len > Number.COMPARE_ZERO) { return len; } else { return 0; } }
XBodhi. 2013-01-21
  • 打赏
  • 举报
回复
2 # 应该说的对吧,是不是前后的编码不一致。转码错误。
失落的神庙 2013-01-21
  • 打赏
  • 举报
回复
空的byte[]转成string 貌似是\0 会有很多\0 记得替换
bdmh 2013-01-21
  • 打赏
  • 举报
回复
弹出对话框,给了更多时间让数据写入缓存,保证了数据的全部到达,不写,运行 很快,那没写完数据,就开始读取了,所以建议你不要直接读,还是要制定协议,确认数据是否接受完整
  • 打赏
  • 举报
回复
MessageBox.Show("接收字符长度为"+backlen.ToString()); => System.Threading.Thread.Sleep(50);

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧