#include /* printf */ #include /* socket, bind, listen */ #include /* htonl */ #include /* memcpy */ #include /* select */ #include /* write */ #include /* gethostbyname */ #include /* free */ int createTCPserverSocket(int port) { int s, len; struct sockaddr_in name; /* Create the socket. */ s = socket(AF_INET, SOCK_STREAM, 0); /* Create the address of the server. */ name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr.s_addr = htonl(INADDR_ANY); /* Use the wildcard address.*/ len = sizeof(struct sockaddr_in); /* Bind the socket to the address. */ if( bind(s, (struct sockaddr *) &name, len)) printf("bind error"); /* Listen for connections. */ listen(s, 5); return(s); } int createTCPclientSocket(char *hostname, int port) { int s, len; struct hostent *hp; struct sockaddr_in name; /* Look up our host's network address.*/ hp = gethostbyname(hostname); /* Create a socket in the INET domain.*/ s = socket(AF_INET, SOCK_STREAM, 0); /* Create the address of the server. */ name.sin_family = AF_INET; name.sin_port = htons(port); memcpy(&name.sin_addr, hp->h_addr_list[0], hp->h_length); len = sizeof(struct sockaddr_in); /* Connect to the server. */ connect(s, (struct sockaddr *) &name, len); return s; } #define BUFF_SIZE 10 void * TCPRelay(void * arg){ /* int arg[] */ fd_set readfds, readfdsCopy; int maxfd, n; int * sockets = (int*) arg; char buff[BUFF_SIZE]; FD_ZERO(&readfdsCopy); FD_SET(sockets[0],&readfdsCopy); FD_SET(sockets[1],&readfdsCopy); maxfd = sockets[0] > sockets[1]?sockets[0]:sockets[1]; maxfd++; for(;;){ memcpy(&readfds, &readfdsCopy, sizeof(fd_set)); n = select(maxfd, &readfds, (fd_set *) 0, (fd_set *) 0, NULL); if (n > 0) { if (FD_ISSET(sockets[0], &readfds)) { if ((n=read(sockets[0], buff, BUFF_SIZE)) <= 0) break; else if (write(sockets[1], buff, n) <= 0) break; } if (FD_ISSET(sockets[1], &readfds)) { if ((n=read(sockets[1], buff, BUFF_SIZE)) <= 0) break; else if (write(sockets[0], buff, n) <= 0) break; } } } close(sockets[0]); close(sockets[1]); free (sockets); }