// SERVER #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #define PORT 5276 int main() { fd_set master; fd_set read_fds; struct sockaddr_in myaddr; struct sockaddr_in remoteaddr; SOCKET fdmax; SOCKET listener; SOCKET newfd; char buf[256]; int nbytes; bool yes = TRUE; socklen_t addrlen; SOCKET i; unsigned int j; FD_ZERO(&master); FD_ZERO(&read_fds); if((listener = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { perror("socket"); exit(1); } if(setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(bool)) == SOCKET_ERROR) { perror("setsockopt"); exit(1); } memset(&myaddr, '\0', sizeof(myaddr)); myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = INADDR_ANY; myaddr.sin_port = htons(PORT); if(bind(listener, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1) { perror("bind"); exit(1); } if(listen(listener, 15) == -1) { perror("listen"); exit(1); } FD_SET(listener, &master); fdmax = listener; for(;;) { read_fds = master; if(select((int)fdmax +1, &read_fds, NULL, NULL, NULL) == -1) { perror("select"); exit(1); } for(i=0;i<=fdmax;i++) { if(FD_ISSET(i, &read_fds)) { addrlen = sizeof(remoteaddr); if((newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen)) == -1) { perror("accept"); } else { FD_SET(newfd, &master); if(newfd>fdmax) { fdmax = newfd; } printf("selectserver: new connection from %s on socket %d\n", inet_ntoa(remoteaddr.sin_addr), newfd); } } else { if((nbytes = recv(i, buf, sizeof(buf), 0)) <= 0) { if(nbytes==0) { printf("selectserver: socket %d hung up\n", i); } else { perror("recv"); } closesocket(i); FD_CLR(i, &master); } else { for(j=0;j<=fdmax;j++) { if(FD_ISSET(j, &master)) { if(j!=listener && j!=i) { if(send(j, buf, nbytes, 0) == -1) { perror("send"); } } } } } } } } return 0; }