正文

关于异步Socket接收模式下的Socket缓冲区2006-01-04 11:27:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tujun/9305.html

分享到:

在使用Socket的 异步接收时,需要定义一个对象: /// <summary> /// 传输对象 /// </summary> public class TranslateObj {  /// <summary>  /// 缓冲区  /// </summary>  public byte[] bytes;  /// <summary>  /// 缓冲区大小  /// </summary>  public const int BUFFER_SIZE = 512;  /// <summary>  /// 存放重复接收数据的列表  /// </summary>  public ArrayList tmpAl;  /// <summary>  /// 接收/发送数据的Socket  /// </summary>  public Socket csock;  public TranslateObj()  {   this.csock = null;   this.bytes = new byte[BUFFER_SIZE];   this.csock = null;  }  ~TranslateObj()  {   this.tmpAl = null;   this.csock = null;  } } 使用时,调用下述方法: private void ReceiveStart(Socket thisSocket) {       TranslateObj obj = new TranslateObj();      obj.csock = thisSocket;       obj.bytes = new byte[TranslateObj.BUFFER_SIZE];      obj.tmpAl = new ArrayList(2048);      obj.csock.BeginReceive(obj.bytes,0,TranslateObj.BUFFER_SIZE,0,       new AsyncCallback(ReceiveCallBack),obj); } /// <summary>  /// 异步接收回调函数  /// </summary>  /// <param name="ar"></param>  private void ReceiveCallBack(IAsyncResult ar) {     TranslateObj obj = (TranslateObj)ar.AsyncState;     int revCount = obj.csock.EndReceive(ar);    if(revCount >0)//如果接收的内容长度大于0 {    ;//一般情况下,在此调用接收数据事件完成对接收数据的处理,问题就在此,如果此处接收的数据包长度大于BUFFER_SIZE,那么就会出现数据包不齐,下一个数据包就会粘连!解决此问题的方法:  //使用ArrayList: byte[] tmpbytes = new byte[revCount]; Array.Copy(obj.bytes,0,tmpbytes,revCount); obj.tmpAl.AddRange(tmpbytes); if(obj.csock.Available >0) { obj.bytes = new byte[obj.csock.Available];  obj.csock.BeginReceive(obj.bytes,0,obj.csock.Available,0,       new AsyncCallback(ReceiveCallBack),obj);//再次投递接收事件,把缓冲区内容全部接收 } else { byte[] endreceive = new byte[obj.tmpAl.Count]; tmpAl.CopyTo(endreceive); //在此触发数据接收事件,接收内容就是endreceive中的内容 } }

阅读(8198) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册