荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: hellsolaris (qq), 信区: Security
标  题: 端口重定向源码
发信站: 荔园晨风BBS站 (Sat Nov  1 12:39:19 2003), 站内信件

windows下的代码同linux下的大同小异
稍加改动即可,这里不一一列出。
/**********************************************************************
Module Name:AgentGateWay.c
Date:2001/4/15
CopyRight(c) eyas
说明:端口重定向工具,在网关上运行,把端口重定向到内网的IP、PORT,
就可以进入内网了
sock[0]==>sClient sock[1]==>sTarget
**********************************************************************/
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
char  TargetIP[100]="127.0.0.1";
int  TargetPort= 23;
int  ListenPort= 3389;//监听端口
int sock[2];
/*************************************************************************
Module:TCPDataRedird.c
Date:2001/4/16
CopyRight(c) eyas
HomePage:www.patching.net
Thanks to shotgun
说明:TCP socket数据转发,sock[0]==>sClient sock[1]==>sTarget
*************************************************************************/
#define BuffSize 20*1024 //缓冲区大小20k
#define max(a,b)    (a>b?a:b)
//此函数负责从Client读取数据,然后转发给Target
static void * TCPDataC2T(void* socks)
{
int iRet,
ret=-1,//select 返回值
iLeft,
idx,
iSTTBCS=0;//STTBCS=SendToTargetBuffCurrentSize
char szSendToTargetBuff[BuffSize],
szRecvFromClientBuff[BuffSize];
fd_set fdread,fdwrite;
int maxfd;
printf("\n\n*****************Connection Active*******************\n\n");
while(1)
{
if (sock[0]<0 || sock[1]<0) return;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_SET(sock[0],&fdread);
FD_SET(sock[1],&fdwrite);
maxfd=max(sock[0],sock[1])+1;
if((ret=select(maxfd,&fdread,&fdwrite,NULL,NULL))==-1)
{
printf("\nselect() failed:\n");
break;
}
if(ret>0)
{
//sClinet可读,client有数据要发送过来
if(FD_ISSET(sock[0],&fdread))
{
//接收sock[0]发送来的数据
iRet=recv(sock[0],szRecvFromClientBuff,BuffSize,0);
if(iRet<0)
{
printf("\nrecv() from sock[0] failed:\n");
close(sock[0]);
sock[0]=-1;
break;
}
printf("\nsend %d bytes to Client",iRet);
iLeft-=iRet;
idx+=iRet;
}
//清空缓冲区
memset(szSendToClientBuff,0,BuffSize);
iSTCBCS=0;
}
}//end of select ret
sleep(1);
}//end of while
return ;
}
int main(int argc,char **argv)
{
int sListen=-1;//本机监听的socket
//int sock[2];
struct sockaddr_in Local,Client,Target;
int iAddrSize;
pthread_t tidc2t,tidt2c;
if (argc<4){
printf("Usage:%s localPort <targetIP> targetPort\n",argv[0]);
exit(0);
}
ListenPort=atoi(argv[1]);
strcpy(TargetIP,argv[2]);
TargetPort=atoi(argv[3]);
sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(sListen<1)
{
    printf("\nsocket() failed:\n");
    exit(-1);
}
Local.sin_addr.s_addr=htonl(INADDR_ANY);
Local.sin_family=AF_INET;
Local.sin_port=htons(ListenPort);
Target.sin_family=AF_INET;
Target.sin_addr.s_addr=inet_addr(TargetIP);
Target.sin_port=htons(TargetPort);
if(bind(sListen,(struct sockaddr *)&Local,sizeof(Local))==-1)
{
    printf("\nbind() failed:\n");
    exit(-1);
}
if(listen(sListen,3)==-1)
{
    printf("\nlisten() failed:\n");
    exit(-1);
}
//scoket循环
while(1)
{
    printf("\n\n*************Waiting Client Connect to**************\n\n");
    iAddrSize=sizeof(Client);
    //get socket sClient
    sock[0]=accept(sListen,(struct sockaddr *)&Client,&iAddrSize);
    if(sock[0]==-1)
    {
        printf("\naccept() failed:\n");
        break;
    }
    printf("\nAccept client==>%s:%d\n",inet_ntoa(Client.sin_addr),
    ntohs(Client.sin_port));
    //create socket sTarget
    sock[1]=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if(sock[1]==-1)
    {
        printf("\nsocket() failed:\n");
        exit(-1);
    }
    //connect to target port
    if(connect(sock[1],(struct sockaddr *)&Target,sizeof(Target))!=0)
    {
        printf("\nconnect() failed:\n");
        exit(-1);
    }
    printf("\nconnect to target success!");
// Create 2 threads for Data redirect
pthread_create(&tidc2t,NULL,&TCPDataC2T,(void*)sock);
pthread_create(&tidt2c,NULL,&TCPDataT2C,(void*)sock);
pthread_join(tidc2t,NULL);
pthread_join(tidt2c,NULL);
if (sock[1]>0) close(sock[1]);
if (sock[0]>0) close(sock[0]);
printf("\n\n*****************Connection Close*******************\n\n");
}//end of sock外循环
if(sListen!=-1) close(sListen);
if(sock[0]!=-1) close(sock[0]);
if(sock[1]!=-1) close(sock[1]);
return 0;
}

--

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.44.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店