发送端发送1000字节,接收端发生FD_READ事件,假设这1000字节完整地一次性发送到了接收端
在事件处理中,用recv读出500字节即返回
此时发送端数据已发送完成,不再发新数据,
请问接收端是否还会产生FD_READ事件来提醒我还有500字节未处理

解决方案 »

  1.   

       如果只是单纯recv的话,那么后500字节就做丢弃处理。这取决你接收数据缓冲区的大小。一般发送缓冲区和接受缓冲区是相等的,或者接受的大于发送的。
      

  2.   

    如果只是单纯recv的话,那么后500字节就做丢弃处理
    -----------------
    有点疑问,TCP协议不是有自己的缓存吗?
    假如说发送端的缓冲大于接收端的缓冲,一定会发生数据丢失吗?
      

  3.   

    不会再有FD_READ风络事件通知。
      

  4.   

    那也即意味着在FD_READ事件中必须把已达到的数据全部取出吗
    如果不能全部取出的话,是否会象2楼说的那样,未取出的数据丢失了,再也取不到?
      

  5.   

    缓冲区有数据就可以select到FD_READ
      

  6.   

    缓冲区有数据就可以select到FD_READ
    -----------
    这是我希望的,但现在有几种不同的意见了,有点拿不准,希望更多朋友参与讨论如果是这样的话,那么每recv一次后是不是要重新调用select才能有FD_READ,还是说只要在socket连接完成后select一次后以后只要缓冲区有数据就会有FD_READ事件?
      

  7.   

    不会再有FD_READ,但是那些没有取出的数据是保存在socket数据系统缓冲区中的,如果你不关闭socket,这些数据一直在,如果你调用recv,那还可能取得那些数据。
      

  8.   

    缓冲区有数据的话,需要判断返回值来判断是否需要继续调用recv
      

  9.   

    不会再有FD_READ,但Recv是从缓冲区里面取数据的,取多少你自己可以定的,没有取完可以继续调用Recv接着取,直到Recv返回0为止,这时表示缓冲区的数据取完了。。
      

  10.   

    不会再有FD_READ,OK,我就以这样的方式去构建我的代码好了
    谢谢诸位兄弟,结帖前想再问个问题:假如发送端一次发的数据长度比较大的话,在tcp底层处理时会拆分成几部分发送的吧,那么
    接收端会发生几次FD_READ事件呢?是一次(所有数据全部到达后触发),还是多次(每个部分达到都触发)?
      

  11.   

    会的,每次有数据到来时,都会产生FD_READ
      

  12.   

    你用的是UDP的,后面的会丢弃掉。UDP的要么全收,要么一个字节都收不到!
      

  13.   

    现在看了一些资料,了解到UDP是基于消息的协议,TCP是基于流的协议,所以TCP的数据接收情况要复杂些,要自己实现消息边界的保护,自己已经在编程中考虑了自己目前所知的各种情况,做了一个类似vb的winsock控件,目前测试中,改日与大家分享