UDP接收设置阻塞超时

基于udp的socket通信时,linux系统调用recvfrom函数。

  • 函数功能如下:
  1. 从套接字上接收一个消息。
  2. recvfrom :可同时应用于面向连接(TCP)的和无连接(UDP)的套接字。
  3. recv:一般只用在面向连接(TCP)的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。
  • 存在的问题:阻塞等待超时

假如套接字上没有消息可以读取,除非套接字已被设置为非阻塞模式,否则接收recvfrom一直阻塞等待消息的到来。

  • 在涉及套接字的I/O操作上设置超时的方法有以下三种:
  1. 调用alarm。
  • 它在指定超时期满时产生SIGALARM。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。
  1. 调用select。select有内置的时间限制,在select中阻塞等待I/O,以此替代直接阻塞在read或write调用上。
  2. 调用套接字函数setsockopt使用SO_RECVTIMEO和SO_SNDTIMEO套接字选项

这里介绍比较简单的setsockopt设置超时时间的方法
 

    /* 设置阻塞超时 */
    struct timeval timeOut;
    timeOut.tv_sec = 5;                 //设置5s超时
    timeOut.tv_usec = 0;
    if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
    {
        printf("time out setting failed\n");
    }

    .
    .
    .

    /* 数据阻塞接收 */
    int receivePacketLen = recvfrom(sockfd,buffer,sizeof(buffer),0,(structsockaddr*)&svr_addr,&addrLen);
    if (receivePacketLen == -1 && errno == EAGAIN)      //阻塞接收超时
    {
        printf("timeout, no input!\n");
        exit(1);
    }

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值