- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
recv的超时总结
说明:针对recv返回值,阻塞情况下,当网络异常时,recv是返回个-1,还是阻塞不动,还是根据情况而定呢
一
不论是阻塞还是非阻塞,都是 0:出错,=0:连接关闭,0接收到数据大小Recv0情况
特别:返回值 0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取)。很多人说阻塞模式下read会阻塞着读,是否这样?我和同事试了不会阻塞阻塞模式下read返回值 0 errno != EINTR errno != EWOULDBLOCK errno != EAGAIN时,连接异常,需要关闭,read返回值 0 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)时表示没有数据,需要继续接收,如果返回值大于0表示接送到数据。Int getsockopt(int s, int level, int optname, void *optval, socketlen_t *optlen) int setsockopt(int s, int level, int optname, const void *optval, socketlen_t optlen)。两个函数成功返回0,失败返回-1,错误代码存于errno中。
S:套接字
Level:套接字选项操作的层次。可以取:SOL_SOCKET(通用套接字);IPPROTO_IP(IP 层套接字);IPPROTO_TCP(TCP 层套接字)。
Optname:套接字选项名称
Optval:套接字选项的值
Optlen:选项值的大小
通用套接字的选项
SO_KEEPPALIVE:如果一段时间内没有反应,则关闭socket。若没有设置此选项,则socket一直被阻塞。
SO_RCVLOWAT:接收缓冲区的下限,只有缓冲区数据超过了SO_RCVLOWAT才会将数据传到上层应用层。
SO_SNDLOWAT:发送缓冲区的下限,……..才会将数据发送。
SO_RCVTIMEO:设置套接字的超时时间,见结构体 struct timeval.
SO_BINDTODEVICE:将套接字绑定到特定的网络接口,如eth0。
SO_DEBUG:只能对TCP套接字使用,设置该选项后系统将保存TCP发送和接收的所有数据相关信息。
SO_REUSEADDR:绑定套接字用到。套接字正常关闭或异常退出后的一段时间内,端口依然维持原来的绑定状态,设置此选项后避免。
SO_TYPE:获取套接字的类型。SOCK_DGRAM、SOCK_STREAM…
SO_ACCEPTCONN:检测套接字是否处于监听状态,0表示非监听状态。1表示在监听。
SO_BROADCAST:决定套接字是否能够广播。类似于REUSEADDR的用法。
SO_SNDBUF、SO_RCVBUF:用于设置套接字的发送和接收缓冲区的大小。默认值是多少?
SO_ERROR:套接字上发生了异步错误,系统将设置套接字的SO_ERROR,getsockopt调用后so_error的值将自动初始化。
三
多路复用select( )
四 测试实验(linux下测试)
1、 Client端与server端保持通信,3512板断电,client端recv堵住不动。
2、 断网,recv亦堵住不动。
3、 断网,send端发送数据也会堵住不动,为什么这与项目中的情况不一样?Winsocket么?
4、winsock send会堵住20秒或1分钟,随后便返回-1,这与理论上是不一样的(正常情况下,如果没有设置超时的话,send和client都会堵住不动)
5、 winsock recv正常,也会堵住
6、recv采取阻塞方式也不一定收len长度,应用while循环。
文档评论(0)