使用SO_RCVTIMEO套接字选项为recvfrom设置超时

Posted CoverSky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SO_RCVTIMEO套接字选项为recvfrom设置超时相关的知识,希望对你有一定的参考价值。

 1 #include"apue.h"
 2 void do_cli(FILE* fp,int sockfd,const (SA*)pserveraddr,socklen_t len)
 3 {
 4     char sendbuf[maxlen],recvbuf[maxlen];
 5     int n;
 6     struct timeval tv;
 7     tv.tv_sec=5;tv.tv_usec=0;
 8     setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));    //set 5 sec time out 
 9     while((fgets(sendbuf,maxlen,fp))!=NULL)
10     {
11         sendto(sockfd,sendbuf,strlen(sendbuf),0,pserveraddr,len);
12         n=recvfrom(sockfd,recvbuf,maxlen,0,NULL,NULL);
13         if(n<0)
14         {
15             if(errno==EWOULDBLOCK)        //time over but still have not recv from server.
16             {
17                 fprintf(stderr,"time out!\n");
18                 continue;
19             }
20             else    //other error reason
21             {
22                 perror("read error!\n");
23                 continue;
24             }
25         }
26         else
27         {
28             recvbuf[n]=\0;
29             fputs(recvbuf,stdout);
30         }
31         
32     }
33 } 

使用了 setsockopt函数,本例仅使用了读操作超时,若是想使用写操作超时使用SO_SNDTIMEO选项。读操作超时使用SO_RCVTIMEO.

以上是关于使用SO_RCVTIMEO套接字选项为recvfrom设置超时的主要内容,如果未能解决你的问题,请参考以下文章

使用SO_REVTIMEO套接字选项为recvfrom设置超时

为啥 SO_RCVTIMEO 从侦听套接字继承到接受的套接字? [关闭]

使用socket选项SO_RCVTIMEO和SO_SNDTIMEO设置超时时间

如何在 C 中设置 SO_RCVTIMEO 选项仅用于读取而不用于接受

Linux(程序设计):60---定时机制之SO_RCVTIMEOSO_SNDTIMEO选项(附设置connect超时时间案例)

socket_connect没有超时