/*这份代码经源码格式软件格式化过
yang_hx@neusoft.com */
/***************************************************************
Program: sp.c
Description: a smart proxy
Author: Alan Chen (ariesram@may10.ca)
Date: July 10, 2001
***************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<sys/wait.h>
#include<unistd.h>
#include<netinet/in.h>
int do_proxy(int infd);
int max(int i,int j);
void waitchild(int);
int main(void)
{
struct sockaddr_in servaddr,clientaddr ;
int listenfd,connfd ;
int clientlen ;
pid_t chpid ;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET ;
servaddr.sin_port=htons(7001);
servaddr.sin_addr.s_addr=INADDR_ANY ;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
printf("socket error");
exit(-1);
}
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("bind error ");
exit(-1);
}
if(listen(listenfd,5)<0)
{
printf("listen error ");
exit(-1);
}
signal(SIGCHLD,waitchild);
for(;;)
{
clientlen=sizeof(clientaddr);
connfd=accept(listenfd,(struct sockaddr*)&clientaddr,&clientlen);
if(connfd<0)
{
printf("accept error ");
exit(-1);
}
if((chpid=fork())==-1)
{
printf("fork error ");
exit(-1);
}
if(chpid==0)
{
close(listenfd);
do_proxy(connfd);
exit(0);
}
if(chpid>0)
{
close(connfd);
}
}
exit(0);
}
int do_proxy(int infd)
{
struct sockaddr_in rout ;
int outfd ;
int maxfd ;
int count=65535 ;
int n ;
fd_set set ;
char buf[count];
bzero(&rout,sizeof(rout));
rout.sin_family=AF_INET ;
rout.sin_port=htons(22);
rout.sin_addr.s_addr=inet_addr("192.168.0.208");
if((outfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("socket error ");
exit(-1);
}
if(connect(outfd,(struct sockaddr*)&rout,sizeof(rout))<0)
{
printf("connect error ");
exit(-1);
}
while(1)
{
FD_ZERO(&set);
FD_SET(infd,&set);
FD_SET(outfd,&set);
maxfd=max(outfd,infd);
if(select(maxfd+1,&set,NULL,NULL,NULL)<0)
{
perror("select error:");
exit(-1);
}
if(FD_ISSET(infd,&set))
{
n=recv(infd,(void*)buf,count,0);
printf("收到%d字节 ",n);
if(n<=0)
break ;
if(write(infd,(const void*)buf,n)!=n)
{
printf("write error ");
continue ;
}
printf("发送%d字节\n ",n);
}
}
close(infd);
close(outfd);
}
int max(int i,int j)
{
return i>j?i:j ;
}
void waitchild(int signo)
{
int status ;
pid_t childpid ;
if((childpid=waitpid(-1,&status,WNOHANG))<0)
{
printf("wait error ");
exit(1);
}
printf("child %d quitted ",childpid);
return ;
}
|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )
GMT+8, 2024-5-9 19:46 , Processed in 0.036983 second(s), 5 queries , Gzip On, Redis On.
Powered by Discuz! X3.5 Licensed
© 2001-2023 Discuz! Team.