网络超时select和setsockopt的区别和问答

来源:互联网 发布:云科数据云一体机 编辑:程序博客网 时间:2024/05/16 15:39
更详细资料:http://hi.baidu.com/vc_net/item/095fea515d32b3dcd58bac57

setsockopt与select区别:

setsockopt是通过信号来处理的,   超时的时候,read/write返回-1,   而且精度是毫秒级,同时只能一个句柄阻塞.
select可以设置更高的精度(微秒),   同时可以处理多个句柄的阻塞.

setsockopt方法只要設置一次就行了,以後每個read操作前不需要再設置 
而select的話,每個read操作都需要設置一下timeout

 


setsockopt与select解决方案:

求教socket编程:setsockopt与select
以下都是伪代码:
setsockopt(mSock, SOL_SOCKET, SO_SNDTIMEO, 5000, ...) 
setsockopt(mSock, SOL_SOCKET, SO_RCVTIMEO, 5000, ...)
问题1、只知道这是在设置接收、发送超时时间。设置成功与否可以从返回值看出来。
但是,如果接收、发送超时了,会怎么样呢?

fd_set* pFds[2] = { NULL };
select(mSock + 1, pFds[0], pFds[1], NULL, &tv);
问题2、在规定的时间内,根据有没有可以接收的数据、或者要发送的数据,来返回函数的值,不知道这么理解对不对?

问题3、setsockopt只用设置一次,select在每次发送、接收之前都要调用,那么可不可以这样理解:setsockopt可以代替select,反之则不行?

问题4、我只知道send、sendto、recv、recvfrom这些函数阻塞、非阻塞的特性,那么阻塞、非阻塞SOCKET是啥意思?



------解决方案--------------------------------------------------------
本人愚见:
1 设置超时主要是针对阻塞模型socket里的recv等,超时就返回,不超时recv就会一直等待,直到收到对应数据
2 对的
3 不可以,select的主要作用是用于阻塞模型,setsockopt只是用于设置套接字选项的
4 比如recv,阻塞就是如果收不到数据,一直卡在recv这,非阻塞就是就算没收到数据,recv也会返回,这时候就要现在recv之前调用select判断是否有数据可读
------解决方案--------------------------------------------------------
1、和你选择的协议有关,如果是UDP的协议,是不会有返回值的。如果发送、接收超时,信息就丢失了;
2、如果你选择TCP协议,那么是有返回值的,接收成功了,就会有返回值,而且接收的包是有顺序的。
3、阻塞、非阻塞指的是如果包发过去,对方如果接收到就返回信息,如果没有得到返回信息就不继续发,这种是阻塞方式,不管对方是否接收到一直发包,这种是非阻塞方式。
------解决方案--------------------------------------------------------
问题1、超时表示操作未完成,得重新操作
问题2、返回什么操作就旭了
问题3、2者面向的概念不同,setsockopt设置socket的属性,select判断是否能进行某种操作
问题4、阻塞:发出某种操作的请求后,一直等在哪,直到操作完成
非阻塞:发出请求后,就可以继续下次操作了,其结果可能由回调函数来通知
阅读全文
0 0