C++ 简易scoket Server
jopen
10年前
// #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <sys/select.h> #define MAXUSERS 5 #define BUFFER_SIZE 64 #define FD_LIMIT 65535 int USERS[MAXUSERS]; int user_count = 0; void showclient() { int i; printf("user_count: %d\n", user_count); for (i = 0; i < MAXUSERS; i++) { printf("[%d]:%d ", i, USERS[i]); } printf("\n\n"); } int main(int argc, const char * argv[]) { struct sockaddr_in server_addr; struct sockaddr_in client_addr; socklen_t client_addrlength = sizeof(client_addr); bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(33333); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //创建 int sock_fd = socket( PF_INET, SOCK_STREAM, 0 ); if (sock_fd<0) { printf("socket error:%d",errno); close(sock_fd); exit(1); } int yes = 1; if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { perror("setsockopt"); exit(1); } int sret; //绑定 sret = bind( sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr) ); if (sret<0) { printf("bind error:%d",errno); close(sock_fd); exit(2); } //监听 sret = listen(sock_fd, MAXUSERS); if (sret<0) { printf("listen error:%d",errno); close(sock_fd); exit(3); } printf("start ok, listen port:%d\n", ntohs(server_addr.sin_port)); char buf[1024]; int maxsock = sock_fd; fd_set read_fds; //可读 ssize_t ret; while (1) { FD_ZERO(&read_fds); FD_SET(sock_fd, &read_fds); //需要监听的集合 for (int i =0; i<user_count; i++) { if (USERS[i] != 0) { FD_SET(USERS[i], &read_fds); } } //注册监听事件 ret = select(maxsock+1, &read_fds, NULL, NULL, NULL); if (ret<0) { printf("select error\n"); continue; }else if (ret==0){ printf("select timeout\n"); continue; } //读取客户端发来的数据 for (int i =0; i<user_count; i++) { if (FD_ISSET(USERS[i], &read_fds)) { ret = recv(USERS[i], buf, sizeof(buf), 0); printf("client[%d] send:%s\n", i, buf); } } //处理新用户链接 if (FD_ISSET(sock_fd, &read_fds)) { printf("new client\n"); int new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &client_addrlength); if (new_fd<0) { printf("accept error\n"); close(new_fd); continue; } USERS[user_count] = new_fd; printf("new connection client[%d] %s:%d\n", user_count, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); user_count++; if (new_fd > maxsock){ maxsock = new_fd; } } showclient(); } close(sock_fd); return 0; }