select函数的问题,看看你是否真的明白这个函数 select函数大家都很熟悉,不知道大家用过它的第三个参数么,也就是可写集那个参数,现在问题来了,为什么要这个可写集,这个参数有什么意义?大家都会说判断这个socket是否可写,但为什么要判断这个socket可写呢?比如send的时候,我直接send就好了,何必要判断它可写呢?即使send失败,我可以再次send,就如同判断这个socket是否可写是一样的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 接收端tcp窗口满,调用send会被阻塞。 比如你有100个socket,那么你都要send一遍,而通过select就可以得到当前可写的socket,就send这几个就行了 我把100个socket加入到可写集里,当然是想对每个socket发送数据,假如select之后得到所有的socket都可写,我还不是一样把这100个socket send一遍,还不如直接send不需要select判断了,即使只有部分socket可写,对这些可写的socket send之后我还是要反复调用select,来判断另外部分socket可写状态,然后对其send,因此,如果send失败,我可以循环send,直至所有socket的send都成功 这两天我用select模型写了小程序,也在思考这个问题! 顶三楼。举个极端的例子,如果在三秒内所有的socket都不可写,select可以等待三秒,不耗cpu时间的,而所有的socket循环send的代价可想而知。另外如果真想直接send的话也是可以的。但最好预读一下,因为send对网络的侦测不好,放到缓存就算成功了,预读可以判断网络状态然后发送。 楼主试想一下这种环境,你的程序有一个线程是负责监听的,一个专门用于收发工作的,如果你调用send阻塞了,这个线程就干不了别的,虽然这时间可能很短,可这时恰好有些连接已经把数据送达,你没来得及第一时间取出数据,也许一下子TCP接收窗口就会满,而发送方也会在send的时候也会发送窗口满的,通信的效率会大打折扣 select有点像中断,不断send像是在查询,好坏一下就知道 slect 对于连接数不大的,情况还是可以使用。再说,select 模型也可以达到能1000并发连接,前提就是你多开几个线程,一个线程里面有管理64个连接。 如何分析程序 双网卡的UDP通信编程 求助:一个关于调试的小问题!!!谢谢各位 如何判断记录集为空 http协议中的数据是什么格式? 在DLL中能否发送自定义消息给调用它的程序,怎么实现,急????? 请问一下MFC写的ACTIVEX中各函数的执行顺序 菜单的汉字怎么变成了一堆乱码? Richedit3.0头文件哪里有? simple question about Edit Box! 请教媒体计时器问题timeSetEvent,感激+感谢+立结 如何才能接收到按键消息?
我把100个socket加入到可写集里,当然是想对每个socket发送数据,假如select之后得到所有的socket都可写,我还不是一样把这100个socket send一遍,还不如直接send不需要select判断了,即使只有部分socket可写,对这些可写的socket send之后我还是要反复调用select,来判断另外部分socket可写状态,然后对其send,因此,如果send失败,我可以循环send,直至所有socket的send都成功
举个极端的例子,如果在三秒内所有的socket都不可写,select可以等待三秒,不耗cpu时间的,而所有的socket循环send的代价可想而知。另外如果真想直接send的话也是可以的。但最好预读一下,因为send对网络的侦测不好,放到缓存就算成功了,预读可以判断网络状态然后发送。
楼主试想一下这种环境,你的程序有一个线程是负责监听的,一个专门用于收发工作的,如果你调用send阻塞了,这个线程就干不了别的,虽然这时间可能很短,可这时恰好有些连接已经把数据送达,你没来得及第一时间取出数据,也许一下子TCP接收窗口就会满,而发送方也会在send的时候也会发送窗口满的,通信的效率会大打折扣
再说,select 模型也可以达到能1000并发连接,前提就是你多开几个线程,一个线程里面有管理64个连接。