6 #include <sys/socket.h>
8 #include <netinet/in.h>
20 struct sockaddr_in sock_in;
21 struct sockaddr_in sock_out;
23 struct sockaddr in_addr;
29 void transfer(int from,int to)
31 int num_ready,num_read,ret;
32 ioctl(from, FIONREAD, &num_ready);
35 num_read = read(from,buffer,num_ready<BUFSIZE?num_ready:BUFSIZE);
39 fprintf(stderr,"read 0 bytes. exiting.\n");
43 ret = write(to,buffer,num_read);
46 perror("(child) write");
48 fprintf(stderr,"transfer(%d,%d): %d:%d\n",from,to,num_ready,ret);
52 int main(int argc,char *argv[])
57 printf("Usage: netpipe <from_port> <to_port>\n");
64 /* get my host name */
65 if (gethostname(host_name, sizeof(host_name)) == -1)
67 perror("gethostname");
72 if ((hp = gethostbyname(host_name)) == 0)
74 /* Probly doesn't run TCP/IP. oh well. */
75 fprintf(stderr, "Gethostbyname: Unknown host.\n");
79 memset(&sock_in, 0, sizeof(sock_in));
80 memcpy(&sock_in.sin_addr, hp->h_addr, hp->h_length);
81 sock_in.sin_port = htons( FROM );
82 sock_in.sin_family = hp->h_addrtype;
83 sock_in.sin_addr.s_addr = INADDR_ANY;
84 s = socket(hp->h_addrtype, SOCK_STREAM, 0);
91 /* now we've got a socket - we need to bind it */
92 while (bind(s, (struct sockaddr * ) &sock_in,sizeof(sock_in)) < 0)
100 if (listen(s, 5) == -1)
108 /* now accept incoming connections - forking a new process
109 for each incoming connection */
110 fprintf(stderr,"waiting for a connection\n");
111 while (in_fd = accept(s,&in_addr,&in_addrlen))
115 fprintf(stderr,"child is starting in_fd=%d\n",in_fd);
117 /* create a socket to write to */
118 out_fd = socket(hp->h_addrtype, SOCK_STREAM, 0);
121 perror("(child) socket");
125 /* and connect it to the destination */
127 sock_out.sin_port = htons(TO);
128 if (connect(out_fd,(struct sockaddr *)&sock_out,sizeof(sock_out))<0)
130 perror("(child) connect");
135 /* now just do some reading and writing */
136 fprintf(stderr,"(child) entering select loop\n");
144 FD_SET(out_fd, &fds);
146 if ((select_ret = select(255,&fds,NULL,NULL,NULL)) <= 0)
148 perror("(child) select");
154 if (FD_ISSET(in_fd, &fds))
155 transfer(in_fd,out_fd);
157 if (FD_ISSET(out_fd, &fds))
158 transfer(out_fd,in_fd);
165 fprintf(stderr,"in_fd=%d. exiting.\n",in_fd);