int main(int argc, char *argv[]) { int listen_sock; struct sockaddr_in addr; //telnet_t *telnet; //struct sockaddr_in client_addr; socklen_t addrlen; int rs; struct pollfd pfd[2]; char buffer[512]; memset(&pfd, 0, sizeof(pfd)); if((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("cant open socket\n"); exit(errno); } setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&rs, sizeof(rs)); rs = 1; //bzero(&self, sizeof(self)); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(MY_PORT); addr.sin_addr.s_addr = INADDR_ANY; if( bind(listen_sock, (struct sockaddr*)&addr, sizeof(addr)) != 0 ) { perror("cant bind"); exit(errno); } if( listen(listen_sock, 20) != 0 ) { perror("cant listen"); exit(errno); } pfd[1].fd = listen_sock; pfd[1].events = POLLIN; while(1) { if(user.sock != -1) { pfd[0].fd = user.sock; pfd[0].events = POLLIN; } else { pfd[0].fd = -1; pfd[0].events = 0; } rs = poll(pfd, 2, -1); if(rs == -1 && errno == EINTR) { printf("Poll failed\n"); return 1; } if(pfd[1].revents & POLLIN) { addrlen = sizeof(addr); if((rs = accept(listen_sock, (struct sockaddr*)&addr, &addrlen)) == -1) { fprintf(stderr, "accept() failed %d.\n", errno); return 1; } printf("Connected client: %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); user.sock = rs; user.telnet = telnet_init(telopts, _event_handler, 0, &user); telnet_negotiate(user.telnet, TELNET_DO, TELNET_TELOPT_NAWS); } if(pfd[0].revents & POLLIN) { if( (rs = recv(user.sock, buffer, sizeof(buffer), 0)) > 0) { telnet_recv(user.telnet, buffer, sizeof(buffer)); } else if(rs == 0) { printf("connection closed\n"); close(user.sock); telnet_free(user.telnet); user.sock = -1; break; } else if(errno != EINTR) { fprintf(stderr, "recv() failed\n"); exit(1); } } //send(clientfd, "Hello, world!", sizeof("Hello, world!"), 0); } close(listen_sock); return 0; }
int main(int argc, char **argv) { char buffer[512]; short listen_port; int listen_sock; int rs; int i; struct sockaddr_in addr; socklen_t addrlen; struct pollfd pfd[MAX_USERS + 1]; /* initialize Winsock */ #if defined(_WIN32) WSADATA wsd; WSAStartup(MAKEWORD(2, 2), &wsd); #endif /* check usage */ if (argc != 2) { fprintf(stderr, "Usage:\n ./telnet-chatd <port>\n"); return 1; } /* initialize data structures */ memset(&pfd, 0, sizeof(pfd)); memset(users, 0, sizeof(users)); for (i = 0; i != MAX_USERS; ++i) users[i].sock = -1; /* parse listening port */ listen_port = (short)strtol(argv[1], 0, 10); /* create listening socket */ if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "socket() failed: %s\n", strerror(errno)); return 1; } /* reuse address option */ rs = 1; setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&rs, sizeof(rs)); /* bind to listening addr/port */ memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(listen_port); if (bind(listen_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { fprintf(stderr, "bind() failed: %s\n", strerror(errno)); return 1; } /* listen for clients */ if (listen(listen_sock, 5) == -1) { fprintf(stderr, "listen() failed: %s\n", strerror(errno)); return 1; } printf("LISTENING ON PORT %d\n", listen_port); /* initialize listening descriptors */ pfd[MAX_USERS].fd = listen_sock; pfd[MAX_USERS].events = POLLIN; /* loop for ever */ for (;;) { /* prepare for poll */ for (i = 0; i != MAX_USERS; ++i) { if (users[i].sock != -1) { pfd[i].fd = users[i].sock; pfd[i].events = POLLIN; } else { pfd[i].fd = -1; pfd[i].events = 0; } } /* poll */ rs = poll(pfd, MAX_USERS + 1, -1); if (rs == -1 && errno != EINTR) { fprintf(stderr, "poll() failed: %s\n", strerror(errno)); return 1; } /* new connection */ if (pfd[MAX_USERS].revents & POLLIN) { /* acept the sock */ addrlen = sizeof(addr); if ((rs = accept(listen_sock, (struct sockaddr *)&addr, &addrlen)) == -1) { fprintf(stderr, "accept() failed: %s\n", strerror(errno)); return 1; } printf("Connection received.\n"); /* find a free user */ for (i = 0; i != MAX_USERS; ++i) if (users[i].sock == -1) break; if (i == MAX_USERS) { printf(" rejected (too many users)\n"); _send(rs, "Too many users.\r\n", 14); close(rs); } /* init, welcome */ users[i].sock = rs; users[i].telnet = telnet_init(telopts, _event_handler, 0, &users[i]); telnet_negotiate(users[i].telnet, TELNET_WILL, TELNET_TELOPT_COMPRESS2); telnet_printf(users[i].telnet, "Enter name: "); } /* read from client */ for (i = 0; i != MAX_USERS; ++i) { /* skip users that aren't actually connected */ if (users[i].sock == -1) continue; if (pfd[i].revents & POLLIN) { if ((rs = recv(users[i].sock, buffer, sizeof(buffer), 0)) > 0) { telnet_recv(users[i].telnet, buffer, rs); } else if (rs == 0) { printf("Connection closed.\n"); close(users[i].sock); if (users[i].name != 0) { _message(users[i].name, "** HAS DISCONNECTED **"); free(users[i].name); users[i].name = 0; } telnet_free(users[i].telnet); users[i].sock = -1; break; } else if (errno != EINTR) { fprintf(stderr, "recv(client) failed: %s\n", strerror(errno)); exit(1); } } } } /* not that we can reach this, but GCC will cry if it's not here */ return 0; }