#include #include #include #include #include #include #include #include #include #include #include int socket_error (char *error_str) { perror(error_str); exit(1); } int ret; int repeater_socket; struct sockaddr_in listen_address; struct sockaddr accept_address; socklen_t accept_struct_size; void init_receiver (void) { repeater_socket = socket (PF_INET, SOCK_DGRAM, 0); (repeater_socket == -1) && socket_error("socket"); listen_address.sin_family = AF_INET; listen_address.sin_port = htons (7154); listen_address.sin_addr.s_addr = htonl (INADDR_ANY); ret = bind (repeater_socket, (struct sockaddr *)&listen_address, sizeof(listen_address)); (ret==-1) && socket_error("bind"); accept_struct_size = sizeof(accept_address); } void handler (int i) { char buff[8192]={0}; struct timeval interval; fd_set descriptors; interval.tv_sec = 0; interval.tv_usec = 0; FD_ZERO(&descriptors); FD_SET(repeater_socket, &descriptors); while (ret = select(repeater_socket+1, &descriptors, 0, 0, &interval)) { (ret == -1) && socket_error("select"); ret = recvfrom (repeater_socket, buff, 8192, 0, &accept_address, &accept_struct_size); printf ("\e[1;37m%s>", inet_ntoa((*(struct sockaddr_in*)&accept_address).sin_addr)); fwrite (buff, ret, 1, stdout); printf ("\e[0m"); } signal(SIGALRM, handler); alarm(1); } int main (int argc, char *argv[]) { int send_socket; struct sockaddr_in send_address; char ibuff[8192]={0}, c; if (argc!=2) { puts("usage:: a.out ip.address.goes.here"); exit(-1); } setbuf(stdout, NULL); init_receiver(); handler(0); send_socket = socket (PF_INET, SOCK_DGRAM, 0); (send_socket == -1) && socket_error("socket"); send_address.sin_family = AF_INET; send_address.sin_port = htons (7154); send_address.sin_addr.s_addr = inet_addr(argv[1]); ret = connect (send_socket, &send_address, sizeof(send_address)); (send_socket == -1) && socket_error("socket"); while (strncmp(ibuff, "/quit", 5)) { fgets(ibuff, 8192, stdin); send (send_socket, ibuff, strlen(ibuff), 0); } ret = close (send_socket); (ret==-1) && socket_error("close send_socket"); ret = close (repeater_socket); (ret==-1) && socket_error("close repeater_socket"); return 0; }