实战测试SO_REUSEADDR选项
生活随笔
收集整理的這篇文章主要介紹了
实战测试SO_REUSEADDR选项
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? ? 設(shè)置SO_REUSEADDR選項,對應(yīng)TCP套接字處于TIME_WAIT狀態(tài)下的socket可以重復(fù)綁定實用,看代碼吧。
服務(wù)端:
?
#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; }編譯,先啟動服務(wù)端,再啟動客戶端。然后先關(guān)閉服務(wù)端,再關(guān)閉客戶端,讓服務(wù)端處理TIME_WAIT狀態(tài)。
?
?
[mapan@localhost ~]$ netstat -na | grep 8888 tcp 0 0 127.0.0.1:8888 127.0.0.1:49222 TIME_WAIT?
此時,在啟動服務(wù)端,啟動客戶端,可以看到connect函數(shù)成功返回。如果沒有設(shè)置SO_REUSEADDR選項,則connect函數(shù)會返回-1,不信可以試試。
[mapan@localhost test]$ ./client ret=0看,客戶端返回成功了,很簡單,測試一下就知道了。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的实战测试SO_REUSEADDR选项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战tcpdump看RST
- 下一篇: linux下的strerror和perr