免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1872 | 回复: 5
打印 上一主题 下一主题

[网络] 请教setsockopt [复制链接]

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-12 08:59 |只看该作者 |倒序浏览
  1. main(int argc ,char **argv)
  2. {
  3.         int sfd;
  4.         int port;
  5.         struct sockaddr_in in;
  6.         unsigned int optval;
  7.         int len;

  8.         sfd = socket(AF_INET, SOCK_STREAM, 0);

  9.         port = atoi(argv[1]);
  10.         optval = 1;

  11.         Init_inet_sock(&in, "0.0.0.0", port);//对in变量进行赋值操作,

  12.         if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) < 0)
  13.                 printf("setsockopt err\n");


  14.         Bind(sfd, (struct sockaddr*)&in, sizeof (in));

  15.         if (listen(sfd, 10) == -1) {
  16.                 if (errno == EADDRINUSE)
  17.                         printf ("EADDRINUSE\n");
  18.                 else
  19.                         printf ("listen err:%s(%d)\n", strerror(errno), errno);
  20.         }else {
  21.                 printf ("listen right\n");
  22.         }
  23. }
复制代码
对一个已经使用的port进行绑定,为什么还会出现绑定错误(Address already in use (errno:9

论坛徽章:
0
2 [报告]
发表于 2014-05-12 09:09 |只看该作者
返回错误说的很明显了吧! 你用netstat -tunl看看,是否冲突了.

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
3 [报告]
发表于 2014-05-12 09:16 |只看该作者
  1. main(int argc ,char **argv)
  2. {
  3.         int sfd;
  4.         int port;
  5.         struct sockaddr_in in;
  6.         int optval, val = 0;
  7.         int len;

  8.         sfd = socket(AF_INET, SOCK_STREAM, 0);

  9.         port = atoi(argv[1]);
  10.         optval = 1;

  11.         Init_inet_sock(&in, "0.0.0.0", port);

  12.         if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
  13.                 printf("setsockopt err\n");

  14.         getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &val, &len);

  15.         printf("val=%d,len=%d\n", val, len);

  16.         Bind(sfd, (struct sockaddr*)&in, sizeof (in));

  17.         if (listen(sfd, 10) == -1) {
  18.                 if (errno == EADDRINUSE)
  19.                         printf ("EADDRINUSE\n");
  20.                 else
  21.                         printf ("listen err:%s(%d)\n", strerror(errno), errno);
  22.         }else {
  23.                 printf ("listen right\n");
  24.         }
  25. }
复制代码
输出:
val=0,len=0
bind socket error :Address already in use (errno:9
setsockopt好像没设置成功,为什么

回复 2# wangell2012


   

论坛徽章:
0
4 [报告]
发表于 2014-05-12 09:46 |只看该作者
你换一个端口试试先, SO_REUSEADDR这个属性并不是你想象的那样,你可以上网再搜一下.

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2014-05-12 10:18 |只看该作者
SO_REUSEADDR可以重用与某个端口关联的地址,通常是进程挂了,但对应的TCP状态还在内核维护,重启进程可以使用原有端口。而不是重用已经在用的端口,任何选项都做不到,想想也不可能嘛!否则TCP端到端怎么实现?

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
6 [报告]
发表于 2014-05-12 14:00 |只看该作者
从网上找的一句话感觉很有用:
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。

    SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP