4059056 发表于 2014-05-12 08:59

请教setsockopt

main(int argc ,char **argv)
{
      int sfd;
      int port;
      struct sockaddr_in in;
      unsigned int optval;
      int len;

      sfd = socket(AF_INET, SOCK_STREAM, 0);

      port = atoi(argv);
      optval = 1;

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

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


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

      if (listen(sfd, 10) == -1) {
                if (errno == EADDRINUSE)
                        printf ("EADDRINUSE\n");
                else
                        printf ("listen err:%s(%d)\n", strerror(errno), errno);
      }else {
                printf ("listen right\n");
      }
}
对一个已经使用的port进行绑定,为什么还会出现绑定错误(Address already in use (errno:98))

wangell2012 发表于 2014-05-12 09:09

返回错误说的很明显了吧! 你用netstat -tunl看看,是否冲突了.

4059056 发表于 2014-05-12 09:16

main(int argc ,char **argv)
{
      int sfd;
      int port;
      struct sockaddr_in in;
      int optval, val = 0;
      int len;

      sfd = socket(AF_INET, SOCK_STREAM, 0);

      port = atoi(argv);
      optval = 1;

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

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

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

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

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

      if (listen(sfd, 10) == -1) {
                if (errno == EADDRINUSE)
                        printf ("EADDRINUSE\n");
                else
                        printf ("listen err:%s(%d)\n", strerror(errno), errno);
      }else {
                printf ("listen right\n");
      }
}输出:
val=0,len=0
bind socket error :Address already in use (errno:98)
setsockopt好像没设置成功,为什么

回复 2# wangell2012


   

wangell2012 发表于 2014-05-12 09:46

你换一个端口试试先, SO_REUSEADDR这个属性并不是你想象的那样,你可以上网再搜一下.

timespace 发表于 2014-05-12 10:18

SO_REUSEADDR可以重用与某个端口关联的地址,通常是进程挂了,但对应的TCP状态还在内核维护,重启进程可以使用原有端口。而不是重用已经在用的端口,任何选项都做不到,想想也不可能嘛!否则TCP端到端怎么实现?

4059056 发表于 2014-05-12 14:00

从网上找的一句话感觉很有用:
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。

    SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态
页: [1]
查看完整版本: 请教setsockopt