Код: Выделить всё
void work(int s){
if(fork()!=0) return;
#if 0 /* poll() test */
struct pollfd fds;
fds.fd=s;
fds.events=POLLIN;
fds.revents=0;
poll(&fds,1,5000);
fprintf(stderr,(fds.revents&POLLIN ? "some data\n" : "no data\n"));
#endif
int port,t,hrecv;
long addr;
struct pollfd fds[2];
char buf[1024];
for(;;){
if(socks(s,&port,&addr)==0) break;
if((t=make_connection(s,port,addr))==0){
fprintf(stderr,"break on make_connection()\n");
break;
}
fds[0].fd=s;
fds[0].events=POLLIN;
fds[0].revents=0;
fds[1].fd=t;
fds[1].events=POLLIN;
fds[1].revents=0;
while(poll(&fds,2,2000)>0){ /* revents is POLLERR =( */
/*if(fds[0].revents&POLLERR || fds[1].revents&POLLERR){
fprintf(stderr,"break on poll()\n");
break;
}*/
if(fds[0].revents&POLLIN){ /*data from client*/
hrecv=recv(s,buf,sizeof(buf),0);
if(hrecv>0) send(t,buf,hrecv,0);
else break;
}
else if(fds[1].revents&POLLIN){ /* data from target */
hrecv=recv(t,buf,sizeof(buf),0);
if(hrecv>0) send(s,buf,hrecv,0);
}else
fprintf(stderr,"no data\n");
}
break;
}
shutdown(s,SHUT_RDWR);
shutdown(t,SHUT_RDWR);
close(t);
close(s);
exit(0);
}