大哥大姐,这是我的Socket接收语句函数,各位进来看看有什么问题,为何总是死掉????????

loader 2004-08-11 05:34:58
public string ReceiveInfo()
{
if(s.Connected == false)
{
if(!ConnectSocket(Server, Port))
{
MessageBox.Show("连接失败!请检查网络!");
return "error";
}
}
string ReceiStr;
ReceiStr = null;
byte[] ByteRece = new byte[256];
Int32 bytes = s.Receive(ByteRece, ByteRece.Length, 0);
ReceiStr = ReceiStr + Encoding.Unicode.GetString(ByteRece, 0, bytes);
if(bytes < 256)
return ReceiStr;
while (bytes > 0)
{
bytes = s.Receive(ByteRece, ByteRece.Length, 0); //111
ReceiStr = ReceiStr + Encoding.Unicode.GetString(ByteRece, 0, bytes);
if(bytes < 256)
break;
}
return ReceiStr;
}
//很少有情况死掉,但我想如果接收的字符的长度如果正好等于256的话就停到111的那条语句上
读不过去了,大家有没有什么解决办法???
...全文
179 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
daguzhang 2004-08-12
  • 打赏
  • 举报
回复
int leftSize ;
int revdSize = 0;
byte[] bytes = new byte[4];
bytes = s.Receive(ByteRece,4,0)
int length=BitConverter.ToInt32(ByteRece);
leftSize = length;
while(leftSize > 0)
{
ByteRece = new byte[1024];
revdSize+= s.Receive(ByteRece)
leftSize = length-revdSize;
}
daguzhang 2004-08-12
  • 打赏
  • 举报
回复
存放数据的长度你可以设为4个字节
这样的好处是不会出现接受的数据混乱(在不同的机器上通过不同的网络),当然你的客户端也要遵守这样的规定,发送数据前先发送数据的长度。
或者你还可以固定一个发送的长度 每次都发这么大的数据,不过这样的话容易浪费了资源
daguzhang 2004-08-12
  • 打赏
  • 举报
回复
哦 对不起 我写错了一点
我的意思是你每次发送的时候就先发一个你要发送数据长度,在发你要发的数据
在接受的时候先接受长度,根据长度接送数据
int leftSize ;
int revdSize = 0;
byte[] bytes = new byte[1024];
bytes = s.Receive(ByteRece)
leftSize = bytes;
while(leftSize > 0)
{
revdSize+= s.Receive(ByteRece)
leftSize = bytes-revdSize;
}
loader 2004-08-12
  • 打赏
  • 举报
回复
to: daguzhang(MoonWell)
在外面还要套个大循环么?
int leftSize ;
int revdSize = 0;
byte[] bytes = new byte[1024];
bytes = s.Receive(ByteRece)
revdSize+= s.Receive(ByteRece) //这里是指连续的接收两次么?
leftSize = bytes - revdSize;
while(leftSize > 0)
{
leftSize = bytes - revdSize;
revdSize+= s.Receive(ByteRece)
leftSize = bytes-revdSize;
}
csq0516 2004-08-11
  • 打赏
  • 举报
回复
up
daguzhang 2004-08-11
  • 打赏
  • 举报
回复
我给的是接受一次消息的列子
daguzhang 2004-08-11
  • 打赏
  • 举报
回复
你可以改改成这个样子:
int leftSize ;
int revdSize = 0;
byte[] bytes = new byte[1024];
bytes = s.Receive(ByteRece)
revdSize+= s.Receive(ByteRece)
leftSize = bytes - revdSize;
while(leftSize > 0)
{
leftSize = bytes - revdSize;
revdSize+= s.Receive(ByteRece)
leftSize = bytes-revdSize;
}
daguzhang 2004-08-11
  • 打赏
  • 举报
回复
bytes = s.Receive(ByteRece, ByteRece.Length, 0);
这条语句运行后 返回的其实实际接受的长度,并不是ByteRece.Length!
while (bytes > 0)
{
bytes = s.Receive(ByteRece, ByteRece.Length, 0); //111
ReceiStr = ReceiStr + Encoding.Unicode.GetString(ByteRece, 0, bytes);
if(bytes < 256)//这个当BYTES小于256时才BREAK,所以当你的长度是256的时候就死循环了
break;
}
loader 2004-08-11
  • 打赏
  • 举报
回复
bytes = s.Receive(ByteRece, ByteRece.Length, 0); //111
那为何程序会死在这条语句上呢,上回死掉后,我特意吧数据多加了些信息,结果读取的很正常
jimh 2004-08-11
  • 打赏
  • 举报
回复
应该不会,读到256个字节后如果刚好读完了,那么下一次再读就是等于0了,自然会退出。

110,533

社区成员

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

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

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