socket 接收包的问题

planet 2010-11-15 04:57:58
server对数据分割以后发送,
client是把所有的包都接收完以后再组合一起,还是像下面代码那样接收1次就追加?


//TCP协议
for (int i = 0; i < BagSize; i++)
{
int num = socket.Receive(bytes, bytes.Length, 0);
Buffer.BlockCopy(bytes, 0, byteData, i * 2040, num);//标记1
//Thread.Sleep(10);
}


标记1不定时错误:偏移量和长度超出数组的界限,或者计数大于从索引到源集合结尾处的元素数量。
为什么说不定时呢,,,因为有时运行没错误,,,有时有,,,
但是加了Thread.Sleep(10);以后就没有出现上面的错误。。到底是啥原因,接收问题,还是组合问题?
不想用Thread.Sleep(10);它影响效率,,有上面办法解决。。。
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
烈火蜓蜻 2010-11-15
  • 打赏
  • 举报
回复
循环写错了,应该是

for(;k<byteData.Length;k++)
byteData[k-PkgLen]=byteData[k];
Index=k;

改成
for(;k<Index+num;k++)
byteData[k-PkgLen]=byteData[k];
Index=k-PkgLen;

太久没写代码了,一大堆错误
烈火蜓蜻 2010-11-15
  • 打赏
  • 举报
回复
循环写错了,应该是

for(;k<byteData.Length;k++)
byteData[k-PkgLen]=byteData[k];
改成
for(;k<Index+num;k++)
byteData[k-PkgLen]=byteData[k];
烈火蜓蜻 2010-11-15
  • 打赏
  • 举报
回复
Index = 0;
for (;;)
{
int num = socket.Receive(bytes, bytes.Length, 0);
if(num == 0)
{
Thread.Sleep(10);
continue;
}
//byteData 数组大小定义为最大包的长度
Buffer.BlockCopy(bytes, 0, byteData, Index, num);//标记1
if( 判断 byteData 是否已经包含有完整的包信息了 )
{// 是的,byteData数组里已经有完整的一个包数据了
//提取这些数组,并进行处理(根据协议你可以到得本次数据包的长度为多少,长度用PkgLen来保存)
//把byteData数组的前PkgLen个字节删除,把后面数据全部前移.伪代码如下:
int k = PkgLen;
for(;k<byteData.Length;k++)
byteData[k-PkgLen]=byteData[k];
Index=k; // 下次接收的数据,放到byteData数组的Index下标开始的位置
}
}
zhq442577358 2010-11-15
  • 打赏
  • 举报
回复
自己写个拷贝的函数不就可以啦
lilijun04 2010-11-15
  • 打赏
  • 举报
回复
BlockCopy 方法使用偏移量访问 src 参数,而不是使用索引或数组上下限等编程构造。例如,如果使用应用程序的编程语言声明一个上限为零,下限为 -50 的 Int32 数组,然后将该数组和偏移量 5 传递给 BlockCopy 方法,则该方法将访问的第一个数组元素是该数组的第二个元素(位于索引 -49 处)。此外,首先访问数组元素 -49 的哪个字节取决于执行应用程序的计算机的 Edian 设置。
---------------------------------
Buffer.BlockCopy:精确到字节

111,129

社区成员

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

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

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