设置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 4096
int 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 4096
int 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 8888
tcp 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
看,客户端返回成功了,很简单,测试一下就知道了。