请问TCustomSocket::OnRead事件在何条件下触发?
例如:建立连接传输数据,一方接收数据,
当接收方该事件触发时读取数据,
问题是该事件何时触发?是传送到一个字节后就马上触发
还是全部传送完毕数据接收方才出发该事件,
本人菜鸟一个,不要见笑,
谢谢!
本人用C++Builder,因在C++Builder论坛无人回答,
所以希望大家鼎立相助。

解决方案 »

  1.   

    我所知道的一种情况是:
    如果缓冲区里面有数据的话就调用void CClientSocket::OnReceive(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the  
             //base class char buffer[1024]; if(nErrorCode == 0)
    {
    memset(buffer, '\0', sizeof(buffer)); this->Receive(buffer, sizeof(buffer), 0); AfxMessageBox(buffer, MB_OK);
    }
    CSocket::OnReceive(nErrorCode);
    }我的实验:
    我发了1370个 char,在调试中,第一次调用OnReceive后,进入函数体,在下面循环了一次if(nErrorCode == 0)
    {
       memset(buffer, '\0', sizeof(buffer));    //该语句执行两次   this->Receive(buffer, sizeof(buffer), 0); //该语句执行两次   AfxMessageBox(buffer, MB_OK);           //该语句执行一次
    } 最后的message box里面显示的是 (1370-1024)个 char很奇妙的过程,我也是一直对这些函数什么时候被调用很迷茫,也看很多的资料,但我发现,调式程序的收获是最大的。
      

  2.   

    基于MFC的封装的Socket有自己的触发(也就是回调)函数,::OnReceive(...)函数
      

  3.   

    char buffer[1024];你的buffer定义了1024,而你发送了1370,所以要两次了 AfxMessageBox(buffer, MB_OK);           //该语句执行一次
    这句执行一次,而上面两句执行了两次,有点奇怪了我想可能是this->Receive(buffer, sizeof(buffer), 0)这句执行了
    后,buffer区立即又有了后面来的数据,有触发了OnReceive()所以上面执行了两次,最后一句是一次。你可以在做个实验,发送5000长度的,我想上面俩句可能是5次,最后
    一句还是一次呢,哈哈当然不一定了,因为socket本身有个buffer,可能不到5000长度了
    所以未必是五次了,哈哈不过作这样的测试后,就能知道socket本身的buffer大小了,good idea::)
      

  4.   

    还是晕!
    例如我这里发送10M的数据,当对方接收
    事件被触发时对方收到1K数据,那接收完所有数据
    对方要触发多少次OnRead事件啊!那对方怎么知道我传送完了呢?
    那编程多不方便啊!我想肯定不是我想的那样,
    可就是不明白,能否给一个更清楚的答案,谢谢!
      

  5.   

    呵呵,慢慢来,推荐你去看《windows socket网络编程技术》,但是那是基于winsock api函数的
      

  6.   

    ********************************************************************
    我想可能是this->Receive(buffer, sizeof(buffer), 0)这句执行了
    后,buffer区立即又有了后面来的数据,有触发了OnReceive()
    ************************************************************接受缓冲大于 1370 char所以可以一次接受到这么多 charreceive一次,移走 1024 char 还有1370 - 1024 在缓冲中,所以要第二次 receive 啊********************************************************************你可以在做个实验,发送5000长度的,我想上面俩句可能是5次,最后
    一句还是一次呢,哈哈当然不一定了,因为socket本身有个buffer,可能不到5000长度了
    所以未必是五次了,哈哈
    ********************************************************************接受缓冲是有限制的,不是想当然是多少就上多少,我记得是 8*1024 
      

  7.   

    对方要触发多少次OnRead事件啊!那对方怎么知道我传送完了呢?
    那编程多不方便啊!我想肯定不是我想的那样,
    ********************************************************************你要传文件,先传文件的大小,client就知道应该接受多少了啊等到receive够了,就向server发送消息说 收到了
      

  8.   

    To HongHuer(洪湖人在广州):
     谢了,有点明白了,
    还要看书,这方面我没经验。
      

  9.   

    to dislikeMS(扯蛋CEO兼CTO) ( ) 信誉:100 我也是初学,一起进步
      

  10.   

    To HongHuer(洪湖人在广州):
       你太谦虚了,一起进步!
      

  11.   

    1.OnRead函数是一个响应消息队列中特定消息的函数,由系统本身调用。所以你不用管它的调用速度。
    2.显然这个函数是在系统检测到你的Sockect的接受缓冲区有新数后自动调用。
    3.你在发送端不发送数据,它自然不会再调OnRead,而不是说你发什么命令告诉它。当然你可以销毁它。
    4.要判断接受的数据是否到了结尾,这需要你自己定义一个数据的尾帧符号,比如:连续收到5个0x88就表示结束。
    5.10M的数据量是算不得什么的,我在做视频会议的时候,视频加音频的数据最高时站的带宽为3.2M/秒。所以你不必为系统的处理速度担忧。
    最后,赶紧给分。不然不理你了。呵呵。
      

  12.   

    问题是该事件何时触发?是传送到一个字节后就马上触发
    还是全部传送完毕数据接收方才出发该事件,
    //我认为。只要一收到就触发onreceive,收到多少看receive的参数和返回值。
      

  13.   

    我在调试中是这样的在server onsend 
      client onreceive 中设断点调试时在server onsend中调用send后,马上,client中的onreceive就被触发了