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 105 106
| #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <ctype.h>
#include "wrap.h"
#define SERVER_PORT 9527 int main(int argc, char *argv[]){ int i, j, n, maxi; int nready, client[FD_SETSIZE]; int listenFd, connectFd, maxFd, socketFd; char buf[BUFSIZ], str[INET_ADDRSTRLEN];
struct sockaddr_in serverAddr, clientAddr; socklen_t clientAddrLen; listenFd = Socket(AF_INET, SOCK_STREAM, 0); fd_set rset, allset; FD_ZERO(&allset); FD_SET(listenFd, &allset); int opt = 1; setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)); bzero(&serverAddr, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(SERVER_PORT); Bind(listenFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); Listen(listenFd, 128); maxFd = listenFd; maxi = -1; for (i = 0; i < FD_SETSIZE; ++i) client[i] = -1;
while (1){ rset = allset; nready = select(maxFd + 1, &rset, NULL, NULL, NULL);
if (nready == -1) perr_exit("select error");
if (FD_ISSET(listenFd, &rset)){ clientAddrLen = sizeof(clientAddr); connectFd = Accept(listenFd, (struct sockaddr *)&clientAddr, &clientAddrLen); printf("Recived from %s at PORT %d\n", inet_ntop(AF_INET, &(clientAddr.sin_addr.s_addr), str, sizeof(str)), ntohs(clientAddr.sin_port));
for (i = 0; i < FD_SETSIZE; ++i) if (client[i] < 0){ client[i] = connectFd; break; } if(i==FD_SETSIZE){ fputs("Too many clients\n",stderr); exit(1); } FD_SET(connectFd, &allset);
if (maxFd < connectFd) maxFd = connectFd; if(i>maxi) maxi=i; if (--nready == 0) continue; } for (i = 0; i <= maxi; ++i){ if((socketFd=client[i])<0) continue; if (FD_ISSET(socketFd, &rset)){ if ((n=read(socketFd,buf,sizeof(buf)))==0){ close(socketFd); FD_CLR(socketFd, &allset); client[i]=-1; }else if(n>0){ for (j = 0; j < n; ++j) buf[j] = toupper(buf[j]); write(socketFd, buf, n); write(STDOUT_FILENO, buf, n); } if(--nready==0) break; } } } close(listenFd); return 0; }
|