Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8075337
  • 博文数量: 594
  • 博客积分: 13065
  • 博客等级: 上将
  • 技术积分: 10324
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-26 16:44
个人简介

推荐: blog.csdn.net/aquester https://github.com/eyjian https://www.cnblogs.com/aquester http://blog.chinaunix.net/uid/20682147.html

文章分类

全部博文(594)

分类: LINUX

2016-05-12 14:53:54


  1. // 测试setsockopt设置超时是否生效代码
  2. #include <arpa/inet.h>
  3. #include <netinet/in.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <sys/socket.h>
  8. #include <sys/types.h>
  9. #include <unistd.h>

  10. // 编译:
  11. // g++ -g -o x x.cpp
  12. int main()
  13. {
  14.     // 创建一个客户端TCP socket
  15.     int fd = socket(PF_INET, SOCK_STREAM, 0);
  16.     if (-1 == 0)
  17.     {
  18.         perror("socket");
  19.         exit(1);
  20.     }

  21.     // 设定目标地址
  22.     struct sockaddr_in addr;
  23.     addr.sin_family = AF_INET;
  24.     addr.sin_port = htons(9090); // 确保这个端口是打开的
  25.     addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  26.     memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
  27.     int ret = connect(fd, (const struct sockaddr *)&addr, sizeof(addr));
  28.     if (ret != 0)
  29.     {
  30.         perror("connect");
  31.         exit(1);
  32.     }

  33.     // 设置recv超时
  34.     struct timeval timeout;
  35.     timeout.tv_sec = 6; // 设定6秒超时
  36.     timeout.tv_usec = 0;
  37.     ret = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
  38.     if (ret != 0)
  39.     {
  40.         perror("setsockopt");
  41.         exit(1);
  42.     }

  43.     // 调用recv,期望预期的时间内超时
  44.     char buf[4096];
  45.     //ret = recv(fd, buf, sizeof(buf), 0);
  46.     ret = read(fd, buf, sizeof(buf));
  47.     printf("%d: %m\n", ret); // 期待结果:-1: Resource temporarily unavailable

  48.     close(fd);
  49.     return 0;
  50. }

阅读(3419) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~