最近在看<<C#网络应用案例导航>>一书,它在处理TCP无消息边界问题上的做法我有一点不明白.
(略了非主要步骤的代码)
 Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....);
  void AcceptCallBack(IAsyncResult ar)
{
  //下边的socket是传过来的状态信息
  int ReceivedLength=Socket.EndRecieve(ar);
     if (ReceivedLength>0)
     {
              //我知道这是在读取信息收完的标志,Content是转换读到的数据后的字符串
        if(Conent.IndexOf("EOF")>-1)
              {
       //读完了...显示读到的字符...........
              }
        else
          {
           //表示没有收完数据
        Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....);          }
        }
}
我的问题是:
异步的收与发送数据是不是:接收数据是等到有数据收到才回调?发数据是准备好发送的数据就回调?
主要是接收上的,1:如果是不等到有数据就回调,那么有可能是0,(远程机器还没发来数据)而这时数据还没有读完啊,它这里没有else了
        2:如果是有数据发来才回调为什么要ReceivedLength>0才处理?这是肯定的啊
只用(Conent.IndexOf("EOF")>-1)不就好了?
还有个例子
     if (ReceivedLength>0)
     {
              //我想它的意思是大于0就表示没有收完数据,这里又开始读
        Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....);    }
   else
      {
         //显示数据代码........
       }
   这个我也不明白,同样的如果远程主机还没有发来数据(TCP缓冲区的原因),就有可能是读到0那么怎么能说没读到数据就算是读完了??
 朋友们帮我说明一下吧,谢了

解决方案 »

  1.   

    你的代码感觉有问题.按MSDN的示例,接收连接和收到数据应该使用两个回调方法.这样可能比较好理解.我的理解是这样的:
    服务器端收到连接和接收数据都会回调. 而你的代码中把这两个回调使用了一个方法,当然这样也可以,但理解起来可能会很麻烦.如果你按MSDN中的写法,你就不会有太多的疑问了.
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingnon-blockingserversocket.htm