events[i].last_active, i); return 0;} int init_sock(。Linux(服务器编程):百万并发服务器系统参数调优( 二 )。" />

Linux(服务器编程):百万并发服务器系统参数调优( 二 )

< 0) { printf("%s: fcntl nonblocking failed, %d\n", __func__, MAX_EPOLL_EVENTS); break;}nty_event_set(nty_event_add(reactor->epfd, EPOLLIN,} while (0); printf("new connect [%s:%d][time:%ld], pos[%d]\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), reactor->events[i].last_active, i); return 0;} int init_sock(short port) { int fd = socket(AF_INET, SOCK_STREAM, 0); fcntl(fd, F_SETFL, O_NONBLOCK); struct sockaddr_in server_addr; memset( server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port); bind(fd, (struct sockaddr*) if (listen(fd, 20) < 0) { printf("listen failed : %s\n", strerror(errno)); } return fd;} int ntyreactor_init(struct ntyreactor *reactor) { if (reactor == NULL) return -1; memset(reactor, 0, sizeof(struct ntyreactor)); reactor->epfd = epoll_create(1); if (reactor->epfd <= 0) { printf("create epfd in %s err %s\n", __func__, strerror(errno)); return -2; } reactor->events = (struct ntyevent*)malloc((MAX_EPOLL_EVENTS) * sizeof(struct ntyevent)); if (reactor->events == NULL) { printf("create epfd in %s err %s\n", __func__, strerror(errno));close(reactor->epfd); return -3; } return 0;} int ntyreactor_destroy(struct ntyreactor *reactor) { close(reactor->epfd); free(reactor->events);} int ntyreactor_addlistener(struct ntyreactor *reactor, int sockfd, NCALLBACK *acceptor) { if (reactor == NULL) return -1; if (reactor->events == NULL) return -1; nty_event_set( nty_event_add(reactor->epfd, EPOLLIN,return 0;} int ntyreactor_run(struct ntyreactor *reactor) { if (reactor == NULL) return -1; if (reactor->epfd < 0) return -1; if (reactor->events == NULL) return -1; struct epoll_event events[MAX_EPOLL_EVENTS+1]; int checkpos = 0, i; while (1) { long now = time(NULL); for (i = 0;i < 100;i ++, checkpos ++) { if (checkpos == MAX_EPOLL_EVENTS) {checkpos = 0;} if (reactor->events[checkpos].status != 1) { continue;} long duration = now - reactor->events[checkpos].last_active; if (duration >= 60) {close(reactor->events[checkpos].fd); printf("[fd=%d] timeout\n", reactor->events[checkpos].fd);nty_event_del(reactor->epfd,}} int nready = epoll_wait(reactor->epfd, events, MAX_EPOLL_EVENTS, 1000); if (nready < 0) { printf("epoll_wait error, exit\n"); continue;} for (i = 0;i < nready;i ++) { struct ntyevent *ev = (struct ntyevent*)events[i].data.ptr; if ((events[i].events} if ((events[i].events}} }} int main(int argc, char *argv[]) { unsigned short port = SERVER_PORT; if (argc == 2) {port = atoi(argv[1]); } int sockfd = init_sock(port); struct ntyreactor *reactor = (struct ntyreactor*)malloc(sizeof(struct ntyreactor)); ntyreactor_init(reactor); ntyreactor_addlistener(reactor, sockfd, accept_cb); ntyreactor_run(reactor); ntyreactor_destroy(reactor); close(sockfd); return 0;}mul_port_client_epoll.c

  • Github源码链接参阅:
// mul_port_client_epoll.c// 源码链接: #include #include #include #include #include #include #include #include #include #include #include #include #include #include#define MAX_BUFFER128#define MAX_EPOLLSIZE (384*1024)#define MAX_PORT1 #define TIME_SUB_MS(tv1, tv2)((tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000) int isContinue = 0; static int ntySetNonblock(int fd) { int flags;flags = fcntl(fd, F_GETFL, 0); if (flags < 0) return flags; flags |= O_NONBLOCK; if (fcntl(fd, F_SETFL, flags) < 0) return -1; return 0;} static int ntySetReUseAddr(int fd) { int reuse = 1; return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)}int main(int argc, char **argv) { if (argc <= 2) { printf("Usage: %s ip port\n", argv[0]); exit(0); }// 获取要连接的服务端的ip和端口 const char *ip = argv[1]; int port = atoi(argv[2]);int connections = 0; char buffer[128] = {0}; int i = 0, index = 0;// 创建epoll struct epoll_event events[MAX_EPOLLSIZE]; int epoll_fd = epoll_create(MAX_EPOLLSIZE);strcpy(buffer, " Data From MulClient\n");// 初始化服务器地址 struct sockaddr_in addr; memset( addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip);struct timeval tv_begin; gettimeofday(while (1){ if (++index >= MAX_PORT) index = 0;struct epoll_event ev; int sockfd = 0;// 如果连接数小于340000 , 继续连接服务器 if (connections < 340000if (sockfd == -1) {perror("socket"); goto err;}//ntySetReUseAddr(sockfd);addr.sin_port = htons(port + index);// 连接服务器 if (connect(sockfd, (struct sockaddr*) goto err;}ntySetNonblock(sockfd);// 将套接字设置为非阻塞ntySetReUseAddr(sockfd); // 设置可重用本地地址// 向服务器发送数据 sprintf(buffer, "Hello Server: client --> %d\n", connections);send(sockfd, buffer, strlen(buffer), 0);// 将套接字设置为可读可写 , 然后加入到epoll_wait()中ev.data.fd = sockfd;ev.events = EPOLLIN | EPOLLOUT;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd,connections ++;}// 如果每连接了一千个客户端或者连接数超过340000 , 那么就执行这个条件 if (connections % 1000 == 999 || connections >= 340000){ struct timeval tv_cur; memcpy(gettimeofday(// 打印一下每连接1000个客户端所消耗的时间 int time_used = TIME_SUB_MS(tv_begin, tv_cur); printf("connections: %d, sockfd:%d, time_used:%d\n", connections, sockfd, time_used);// 进行epoll_wait() int nfds = epoll_wait(epoll_fd, events, connections, 100); for (i = 0;i