1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include "utility.h"
int main(int argc, char *argv[]){
struct sockaddr_in serverAddr; serverAddr.sin_family = PF_INET; serverAddr.sin_port = htons(SERVER_PORT); serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
int listener = socket(PF_INET, SOCK_STREAM, 0); if(listener < 0){ perror("socket failed"); exit(1); } int opt=1; setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); printf("listen socket success, listenfd = %d\n", listener); if(bind(listener, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){ perror("bind failed"); exit(1); } int ret = listen(listener, 5); if (ret < 0){ perror("listen failed"); exit(1); }
printf("start listen: %s\n", SERVER_IP);
int epfd = epoll_create(EPOLL_SIZE); if(epfd < 0){ perror("epoll_create failed"); exit(1); }
printf("epoll create, epollfd = %d\n", epfd); static struct epoll_event events[EPOLL_SIZE];
addfd(epfd, listener, true);
while(1){
int epoll_events_count = epoll_wait(epfd, events, EPOLL_SIZE, -1); if(epoll_events_count < 0){ perror("epoll_wait failed"); break; } printf("epoll_events_count:%d\n", epoll_events_count);
for (int i=0; i<epoll_events_count; i++){ int sockfd = events[i].data.fd; if (sockfd == listener){ struct sockaddr_in clientAddr; socklen_t clientAddrLen = sizeof(clientAddr); int connfd = accept(listener, (struct sockaddr *)&clientAddr, &clientAddrLen); printf("client connection from %s:%d clientfd=%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), connfd);
addfd(epfd, connfd, true);
clients_list.push_back(connfd); printf("Add new clientfd = %d to epoll.\n", connfd); printf("Now there are %d clients int the chat room\n", (int)clients_list.size());
printf("welcome message\n"); char message[BUF_SIZE]; bzero(message, BUF_SIZE); snprintf(message, sizeof(message), SERVER_WELCOME, connfd); int ret = send(connfd, message, BUF_SIZE, 0); if (ret < 0){ printf("line:%d errno:%d\n", __LINE__, errno); perror("send failed"); exit(1); } } else { int ret = sendBroadcastMessage(sockfd); if (ret < 0){ printf("line:%d errno:%d\n", __LINE__, errno); perror("send failed"); exit(1); } } } }
close(listener);
close(epfd);
return 0; }
|