📄 chats.c
字号:
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#include <sys/select.h>#define MAXLINE 1024#define BACKLOG 20intmain(int argc, char **argv){ int i, j,maxi, maxfd, listenfd, connfd, sockfd; int nready, client[FD_SETSIZE]; ssize_t n; fd_set rset, allset; char line[MAXLINE],temp[INET_ADDRSTRLEN]; socklen_t clilen,templen; struct sockaddr_in cliaddr, servaddr,tempaddr; if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0))<0 ) { perror("socket"); } bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = 0; if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1) { perror("bind"); exit(1); } /* how we can get the binded socket information */ templen = sizeof(struct sockaddr); if (getsockname(listenfd, (struct sockaddr *)&tempaddr,&templen) == -1){ perror("getsockname"); exit(1); } printf("Server is listening on port %d\n",ntohs(tempaddr.sin_port)); if (listen(listenfd,BACKLOG) == -1){ perror("listen"); exit(1); } maxfd = listenfd; /* initialize */ maxi = -1; /* index into client[] array */ for (i = 0; i < FD_SETSIZE; i++) client[i] = -1; /* -1 indicates available entry */ FD_ZERO(&allset); FD_SET(listenfd, &allset); for ( ; ; ) { rset = allset; /* structure assignment */ nready = select(maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) { /* new client connection */ clilen = sizeof(cliaddr); if ( ( connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen) ) < 0) { perror("accept"); } printf("A new guy from: %s, port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, temp, INET_ADDRSTRLEN), ntohs(cliaddr.sin_port)); for (i = 0; i < FD_SETSIZE; i++) if (client[i] < 0) { client[i] = connfd; /* save descriptor */ break; } if (i == FD_SETSIZE) perror("too many clients"); FD_SET(connfd, &allset); /* add new descriptor to set */ if (connfd > maxfd) maxfd = connfd; /* for select */ if (i > maxi) maxi = i; /* max index in client[] array */ if (--nready <= 0) continue; /* no more readable descriptors */ } for (i = 0; i <= maxi; i++) { /* check all clients for data */ if ( (sockfd = client[i]) < 0) continue; if (FD_ISSET(sockfd, &rset)) { if ( (n = read(sockfd, line, MAXLINE)) == 0) { /*4connection closed by client */ close(sockfd); FD_CLR(sockfd, &allset); client[i] = -1; } else { printf("%s",line); for(j=0;(j<=maxi)&&((sockfd=client[j])>=0);j++) { if(j==i) continue; write(sockfd,line,n); } } if (--nready <= 0) break; /* no more readable descriptors */ } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -