实战测试SO_REUSEADDR选项

来源:互联网 发布:不可思议的夏天知乎 编辑:程序博客网 时间:2024/05/21 09:07

                设置SO_REUSEADDR选项,对应TCP套接字处于TIME_WAIT状态下的socket可以重复绑定实用,看代码吧。

服务端:

#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <errno.h>#include <malloc.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/ioctl.h>#include <stdarg.h>#include <fcntl.h>#include <sys/types.h>#include <sys/wait.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#define MAXLINE 4096int main(){   int listenfd,acceptfd,n;   socklen_t  clilen;   char recvbuf[100]={0};   struct sockaddr_in cliaddr,servaddr;   listenfd=socket(AF_INET,SOCK_STREAM,0);   servaddr.sin_family=AF_INET;   servaddr.sin_port=htons(8888);   servaddr.sin_addr.s_addr = INADDR_ANY;    int iOpt = 1;   setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &iOpt, sizeof(iOpt));   bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));   listen(listenfd,5);   clilen=sizeof(cliaddr);   acceptfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);      getchar();   close(acceptfd);   close(listenfd);   return 0;}
客户端:

#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <errno.h>#include <malloc.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/ioctl.h>#include <stdarg.h>#include <fcntl.h>#include <sys/types.h>#include <sys/wait.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#include <netinet/tcp.h>#define MAXLINE 4096int main(){   int sockfd,ret;   struct sockaddr_in servaddr;   char sendbuf[1000]={0};   sockfd=socket(AF_INET,SOCK_STREAM,0);   bzero(&servaddr,sizeof(servaddr));   servaddr.sin_family=AF_INET;   servaddr.sin_port=htons(8888);   servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");   ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));   printf("ret=%d\n",ret);   getchar();   close(sockfd);   return 0;}
编译,先启动服务端,再启动客户端。然后先关闭服务端,再关闭客户端,让服务端处理TIME_WAIT状态。

[mapan@localhost ~]$ netstat -na | grep 8888tcp        0      0 127.0.0.1:8888              127.0.0.1:49222             TIME_WAIT 

此时,在启动服务端,启动客户端,可以看到connect函数成功返回。如果没有设置SO_REUSEADDR选项,则connect函数会返回-1,不信可以试试。

[mapan@localhost test]$ ./client ret=0

看,客户端返回成功了,很简单,测试一下就知道了。




原创粉丝点击