select函数大家都很熟悉,不知道大家用过它的第三个参数么,也就是可写集那个参数,现在问题来了,为什么要这个可写集,这个参数有什么意义?大家都会说判断这个socket是否可写,但为什么要判断这个socket可写呢?比如send的时候,我直接send就好了,何必要判断它可写呢?即使send失败,我可以再次send,就如同判断这个socket是否可写是一样的

解决方案 »

  1.   

    接收端tcp窗口满,调用send会被阻塞。
      

  2.   

    比如你有100个socket,那么你都要send一遍,而通过select就可以得到当前可写的socket,就send这几个就行了
      

  3.   


    我把100个socket加入到可写集里,当然是想对每个socket发送数据,假如select之后得到所有的socket都可写,我还不是一样把这100个socket send一遍,还不如直接send不需要select判断了,即使只有部分socket可写,对这些可写的socket send之后我还是要反复调用select,来判断另外部分socket可写状态,然后对其send,因此,如果send失败,我可以循环send,直至所有socket的send都成功
      

  4.   

    这两天我用select模型写了小程序,也在思考这个问题!
      

  5.   

    顶三楼。
    举个极端的例子,如果在三秒内所有的socket都不可写,select可以等待三秒,不耗cpu时间的,而所有的socket循环send的代价可想而知。另外如果真想直接send的话也是可以的。但最好预读一下,因为send对网络的侦测不好,放到缓存就算成功了,预读可以判断网络状态然后发送。
      

  6.   


    楼主试想一下这种环境,你的程序有一个线程是负责监听的,一个专门用于收发工作的,如果你调用send阻塞了,这个线程就干不了别的,虽然这时间可能很短,可这时恰好有些连接已经把数据送达,你没来得及第一时间取出数据,也许一下子TCP接收窗口就会满,而发送方也会在send的时候也会发送窗口满的,通信的效率会大打折扣
      

  7.   

    select有点像中断,不断send像是在查询,好坏一下就知道
      

  8.   

    slect 对于连接数不大的,情况还是可以使用。
    再说,select 模型也可以达到能1000并发连接,前提就是你多开几个线程,一个线程里面有管理64个连接。