使用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.

转载于:https://www.cnblogs.com/coversky/p/7859971.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用`setsockopt`函数来设置`recvfrom`的超时时间。具体步骤如下: 1. 创建一个`struct timeval`结构体,用于指定超时时间。该结构体包含两个字段:`tv_sec`表示超时时间的秒数部分,`tv_usec`表示超时时间的微秒数部分。 2. 使用`setsockopt`函数设置套接字选项,将超时时间应用到套接字上。具体的参数如下: - `socket`:要设置选项套接字描述符。 - `level`:选项所属的协议层,对于套接字选项通常为`SOL_SOCKET`。 - `option_name`:要设置选项名称,对于接收超时时间通常为`SO_RCVTIMEO`。 - `option_value`:指向包含超时时间的`struct timeval`结构体的指针。 - `option_len`:指定选项值的长度,通常为`sizeof(struct timeval)`。 下面是一个示例代码,演示如何设置`recvfrom`的超时时间为5秒: ```c #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <unistd.h> int main() { int sockfd; struct sockaddr_in servaddr; // 创建套接字并进行初始化... // 设置超时时间为5秒 struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) { perror("setsockopt error"); // 错误处理... } // 使用recvfrom接收数据,如果超时将返回-1,并设置errno为EAGAIN或EWOULDBLOCK char buffer[1024]; ssize_t numBytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL); if (numBytes < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { printf("Recvfrom timeout\n"); } else { perror("Recvfrom error"); // 错误处理... } } else { // 处理接收到的数据... } // 关闭套接字... return 0; } ``` 请注意,在设置超时时间之后,如果`recvfrom`函数超时,它将返回-1,并将`errno`设置为`EAGAIN`或`EWOULDBLOCK`。您可以根据这个错误码来判断是否超时,并进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值