设为首页 加入收藏

TOP

SO_REUSEADDR例解(二)
2013-01-13 10:31:19 来源: 作者: 【 】 浏览:625
Tags:SO_REUSEADDR 例解

 

  close(listenfd);/*这句不能少,原因请大家想想就知道了。*/

  ticks=time(NULL);

  snprintf(buff,100,"%.24s/r/n",ctime(&ticks));

  write(connfd,buff,strlen(buff));

  close(connfd);

  sleep(1);

  execlp("f1-9d",NULL);

  perror("execlp");

  exit(1);

  }

  close(connfd);

  exit(0);/* end parent*/

  }

  }

  测试:编译为f1-9d程序,放到一个自己PATH环境变量里的某个路径里,例如$HOME/bin,运行f1-9d,然后telnet localhost 10013看结果。

  2、第二种情况我没有环境测,所以就不给测试程序了,大家有条件的可以自己写一个来测试一下。

  3、测试第三种情况的程序

  #include <netinet/in.h>

  #include <sys/socket.h>

  #include <time.h>

  #include <stdio.h>

  #include <string.h>

  #define MAXLINE 100

  int main(int argc, char** argv)

  {

  int fd1,fd2;

  struct sockaddr_in servaddr1,servaddr2;

  char buff[MAXLINE+1];

  time_t ticks;

  unsigned short port;

  int flag=1,len=sizeof(int);

  port=10013;

  if( (fd1=socket(AF_INET,SOCK_STREAM,0)) == -1)

  {

  perror("socket");

  exit(1);

  }

  if( (fd2=socket(AF_INET,SOCK_STREAM,0)) == -1)

  {

  perror("socket");

  exit(1);

  }

  bzero(&servaddr1,sizeof(servaddr1));

  bzero(&servaddr2,sizeof(servaddr2));

  servaddr1.sin_family=AF_INET;

  servaddr2.sin_family=AF_INET;

  if( inet_pton(AF_INET, "127.0.0.1", &servaddr1.sin_addr) <= 0)

  {

  printf("inet_pton() call error:127.0.0.1/n");

  exit(1);

  }

  if( inet_pton(AF_INET, "128.160.1.230", &servaddr2.sin_addr) <= 0)

  {

  printf("inet_pton() call error:128.160.1.230/n");

  exit(1);

  }

  servaddr1.sin_port=htons(port);

  servaddr2.sin_port=htons(port);

  if( setsockopt(fd1, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)

  {

  perror("setsockopt");

  exit(1);

  }

  if( setsockopt(fd2, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)

  {

  perror("setsockopt");

  exit(1);

  }

  if( bind(fd1,(struct sockaddr*)&servaddr1,sizeof(servaddr1)) == -1)

  {

  perror("bind fd1");

  exit(1);

  }

  if( bind(fd2,(struct sockaddr*)&servaddr2,sizeof(servaddr2)) == -1)

  {

  perror("bind fd2");

  exit(1);

  }

  printf("bind fd1 and fd2 OK!/n");

  /*put other process here*/

  getchar();

  exit(0);/* end */

  }

  4、由于第四种情况只用于UDP的多播,和TCP的使用没多大关系,所以就不写测试例子了。自己有兴趣的可以写。

  以上的程序都是在Linux下编译通过的。也可以在其他unix平台运行。

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇前++和后++ 下一篇C++拷贝构造函数和=赋值运算符

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: