标签:socket server 解决time_wait状态等待问题
#include <stdlib.h> #include <dirent.h> #include <time.h> #include <unistd.h> #include <dirent.h> #include <sys/types.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <error.h> int server() { int iSockfd = socket(PF_INET,SOCK_STREAM,0); /*1. 准备socket*/ if(iSockfd == -1) { perror("socket:"); return 0; } /*2. 准备地址*/ struct sockaddr_in addr; addr.sin_family = PF_INET; addr.sin_port = htons(17777); inet_aton("127.0.0.1",&addr.sin_addr); int flag=1,len=sizeof(int); //解决端口TIME_WAIT状态,无法连接 if( setsockopt(iSockfd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1) { return -1; } int iRes = bind(iSockfd, (struct sockaddr*)&addr, sizeof(addr)); /*3.绑定*/ if(iRes == -1) { perror("Bind 失败:"); return -1; } iRes = listen(iSockfd, 100); /*4.监听*/ if(iRes == -1) { perror("监听失败:"); return -1; } int infds; while(1) { /*5.等待客户端连接*/ struct sockaddr_in fromaddr; socklen_t len = sizeof(fromaddr); /*6.和客户端通信*/ /*6.1接收客户端数据*/ char buf[100] = {0}; struct timeval timeout; timeout.tv_sec = 2; timeout.tv_usec = 0; fd_set Readyfd; FD_ZERO(&Readyfd); FD_SET(iSockfd, &Readyfd); infds = select(iSockfd+1, &Readyfd, NULL, NULL, &timeout); if(infds>0) { if(FD_ISSET(iSockfd, &Readyfd)) { int fd = accept(iSockfd, (struct sockaddr*)&fromaddr,(socklen_t *)&len); if(-1 == fd) { /*告警信息 不影响下一个资源申请 所以一直是监听状态*/ continue; } if(read(fd, buf, 100)<=0) { printf("-----Error\n"); close(fd); continue; } else { printf("------buf=%s\n",buf); //sleep(5);//write(fd,(char *) "Server send date", 100); sleep(5); if(write(fd,(char *) "Server send date", 100)<=0) { close(fd); continue; } } } } else if(infds < 0) { perror("错误"); break; } else { printf("超时处理\n"); //write(iSockfd+1,(char *) "---Server--- Send", 100); continue; } } close(iSockfd); return 0; } int main() { server(); return 0; }
socket Server 解决TIME_WAIT状态等待问题
标签:socket server 解决time_wait状态等待问题
原文地址:http://ayang.blog.51cto.com/4224455/1653408