注册 登录
自由的生活_软路由 返回首页

心想事成的个人空间 https://bbs.routerclub.com/?681 [收藏] [复制] [分享] [RSS]

日志

一个端口转发的程序

已有 96 次阅读2009-6-15 13:23

/*这份代码经源码格式软件格式化过
     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 ;
}


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|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.

返回顶部