socketrecv函数使用心得.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

7ky170ms8 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档