日期:2014-05-20  浏览次数:20800 次

询问SOCKET接收数据问题
用VB时,里面自带了一个SOCKET控件,使用那个控件不管每次发送的数据长度多少都可以完整的接收下来。但使用C#后,自己写接收数据代码,有时缓存区设置过小可能接收不全数据,如果缓存区设置过大,可能一次把第二次发送的数据的一部分也接收进来了(每秒都发送并接收数据),那么如何才能做到像VB控件那样,使用默认1024K缓存区都可以把每次大小不定的数据包全部接收进来?

------解决方案--------------------
if( ReceiveStream.DataAvailable )//有数据
{
end = ReceiveStream.Read( BufferData , 0 , 1024 );
if ( ReceiveStream.DataAvailable )//数据大于1024
{
Array.Copy( BufferData , 0 , ReceiveData , start , end );
start += end ;
continue;
}
else
{
Array.Copy( BufferData , 0 , ReceiveData , start , end );
start += end ;
//处理数据
start = 0 ;
end = 0 ;
}
}

------解决方案--------------------
你用到socket.如果是用tcp协议.首先要了解tcp的特性.TCP是一个流协议.就是说你发送的字节是按顺序排列后发过来的.所以你在应用层应该有协议来分解收到的数据.使用sokcet 有两种.一种是同步的.receive()这样会使当前接收的线程阻赛(当然,你可以设置超时.也就是多久没有数据就返回).也可以使用异步的委托方式.就是投递一个beginrecive().当有数据时系统不调用你的异步委托函数.我没有用过控件.控件无非就是调用了socket后对数据做了一些应用层的操作.对于复杂的操作控件是无法完成的.
------解决方案--------------------
这个问题应该这样处理,在发送一个数据包后,发送端等待接收端返回一个正确接收到的特殊字符串后,才继续发送下一个数据包。这样就可以保证每次发送的大小不等的字符都能正确接收到