282.htm

来自「unix高级编程原吗」· HTM 代码 · 共 236 行

HTM
236
字号
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="193.htm">上一层</a>][<a href="283.htm">下一篇</a>]
<hr><p align="left"><small>/* socksd.c, by Digger, main module of socks server */ <br>

  <br>

#include        <stdio.h> <br>

#include        <stdlib.h> <br>

#include        <string.h> <br>

#include        <signal.h> <br>

#include        <sys/types.h> <br>

#include        <sys/socket.h> <br>

#include        <sys/time.h> <br>

#include        <sys/select.h> <br>

#include        <netinet/in.h> <br>

#include        <netdb.h> <br>

#include        <unistd.h> <br>

#include        <errno.h> <br>

#include        "socks.h" <br>

  <br>

extern  int     errno; <br>

extern  u_char  ver;                    /* socks version, in socks_funcs.c */ <br>

  <br>

#ifndef ONLYV4                          /* ONLYV4 means only for version 4 */ <br>

extern  u_char  cur_method;             /* authentication method for socksv5, <br>

                                           defined in socks_v5.c */ <br>

#endif <br>

#endif <br>

  <br>

extern  int     InitAuthIP( );          /* defined in ipauth.c */ <br>

extern  int     IPIsAuthed(u_long);     /* defined in ipauth.c */ <br>

  <br>

int     filter_flag = FALSE;            /* TRUE if useing ip filter */ <br>

int     sock = -1, newsock = -1; <br>

struct  sockaddr_in sin, cli;           /* server and client address entry */ <br>

  <br>

void DoSocksProxy(int sockfd)           /* real socks proxy service */ <br>

{ <br>

        get_version(sockfd); <br>

        if (ver == 4) {                 /* for version 4 */ <br>

                handle_command_v4(sockfd); <br>

                relay_data(sockfd); <br>

#ifndef ONLYV4 <br>

        } else if (ver == 5) {          /* for version 5 */ <br>

                handle_methods_v5(sockfd); <br>

                handle_command_v5(sockfd); <br>

                relay_data(sockfd); <br>

#endif <br>

        } <br>

        close_and_exit(sockfd); <br>



} <br>

  <br>

void sig_interrupt()    /* function handle SIGINT SIGTERM SIGSTPT signals */ <br>

{ <br>

        fprintf(stderr, "socks server terminated by signal\n"); <br>

        if (sock != -1) close(sock); <br>

        close_and_exit(newsock); <br>

} <br>

  <br>

void sig_child()        /* function handle SIGCLD signal */ <br>

{ <br>

        int     pid; <br>

        int     status; <br>

        pid = wait(&status); <br>

} <br>

  <br>

void usage()            /* usage of socksd */ <br>

{ <br>

#ifndef ONLYV4          /* socksd usage (version 4 and 5) */ <br>

        fprintf(stderr, <br>

                "usage:  socksd [-p port] [-d home_directory] [-a y|n]\n"); <br>

#else                   /* socks4d usage (only version 4) */ <br>



        fprintf(stderr, <br>

                "usage:  socks4d [-p port] [-d home_directory]\n"); <br>

#endif <br>

        fprintf(stderr, "       default port is 1080\n"); <br>

        fprintf(stderr, "       home dir is where u want to place ip.auth\n"); <br>

#ifndef ONLYV4 <br>

        fprintf(stderr, "       -a: authentication option for socks v5\n"); <br>

        fprintf(stderr, "       y: user/passwd method, n: none(default)\n"); <br>

#endif <br>

        exit(0); <br>

} <br>

  <br>

void main(int argc, char **argv) <br>

{ <br>

        int     c, childpid, namelen; <br>

        u_short port = SOCKSPORT; <br>

        fd_set  fdR; <br>

        char    *cur_dir; <br>

        extern  char    *optarg; <br>

  <br>

        if (argv[1] && strcmp(argv[1], "help") == TRUE) usage(); <br>

  <br>

  <br>

        while ((c = getopt(argc, argv, "p:d:a:")) != EOF) { <br>

                switch (c) { <br>

                case 'p':               /* server port to be bind */ <br>

                        port = (u_short)atoi(optarg); <br>

                        if (port == 0) usage(); <br>

                        break; <br>

                case 'd':               /* home dir to store some cfg file */ <br>

                        cur_dir = optarg; <br>

                        chdir(cur_dir); <br>

                        break; <br>

#ifndef ONLYV4 <br>

                case 'a': <br>

                        if (strcmp(optarg, "n") == 0) <br>

                                cur_method = NO_AUTH_REQUIRE; <br>

                        else if (strcmp(optarg, "y") == 0) <br>

                                cur_method = USER_AND_PASS; <br>

                        else usage(); <br>

                        break; <br>

#endif <br>

                default : <br>

                        usage(); <br>

                        break;          /* NOTREACHED */ <br>



                } <br>

        } <br>

  <br>

        if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { <br>

                perror("socket"); <br>

                exit(-1); <br>

        } <br>

  <br>

        bzero((char *)& cli, sizeof(cli)); <br>

        bzero((char *)& sin, sizeof(sin)); <br>

        sin.sin_family = AF_INET; <br>

        sin.sin_addr.s_addr = htonl(INADDR_ANY); <br>

        sin.sin_port = htons(port); <br>

  <br>

        if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { <br>

                perror("bind"); <br>

                close(sock); <br>

                exit(-1); <br>

        } <br>

  <br>

        if (listen(sock, 5) < 0) { <br>

                perror("listen"); <br>



                close(sock); <br>

                exit(-1); <br>

        } <br>

  <br>

        if( (childpid = fork()) == -1 ) { <br>

                perror("fork"); <br>

                close(sock); <br>

                exit(-1); <br>

        } else if (childpid > 0) { <br>

                close(sock); <br>

                exit(0); <br>

        } <br>

  <br>

        /* initralizing ip filter */ <br>

        if (InitAuthIP( ) == TRUE) { <br>

                filter_flag = TRUE; <br>

        } <br>

  <br>

        printf("socksd loaded, pid is %u, port is %u\n", getpid(), port); <br>

  <br>

        /* igore and set some signal to act as daemon */ <br>

        signal( SIGINT , (void(*)(int))sig_interrupt ); <br>



        signal( SIGTERM, (void(*)(int))sig_interrupt ); <br>

  <br>

        signal( SIGTTOU, SIG_IGN ); <br>

        signal( SIGTTIN, SIG_IGN ); <br>

        signal( SIGTSTP, (void(*)(int))sig_interrupt ); <br>

  <br>

        sigset( SIGCHLD, (void(*)(int))sig_child ); <br>

        setsid( ); <br>

  <br>

        namelen = sizeof(cli); <br>

        for(;;) { <br>

                FD_ZERO(&fdR); <br>

                FD_SET(sock, &fdR); <br>

  <br>

                /* waiting for client connect in */ <br>

                switch (select(sock + 1, &fdR, NULL, NULL, NULL)) { <br>

                case -1: <br>

                        if (errno == EINTR) continue; <br>

                        else exit(-1); <br>

                case 0: <br>

                        continue; <br>

                default: <br>



                        if (FD_ISSET(sock, &fdR)) { <br>

                                if ((newsock = accept(sock, <br>

                                                (struct sockaddr *)&cli, <br>

                                                &namelen)) < 0) { <br>

                                        if (errno == EINTR) continue; <br>

                                        exit(-1); <br>

                                } <br>

                                if (filter_flag == TRUE) { <br>

                                        if (IPIsAuthed(cli.sin_addr.s_addr) <br>

                                        == FALSE) { <br>

                                                close(newsock); <br>

                                                continue; <br>

                                        } <br>

                                } <br>

                                if ((childpid = fork()) < 0) { <br>

                                        exit(-1); <br>

                                } else if(childpid == 0) {      /* child */ <br>

                                        close(sock); <br>

                                        sock = -1; <br>

                                        DoSocksProxy(newsock); <br>

                                        exit(0); <br>

  <br>



                                } else {                        /* father */ <br>

                                        close(newsock); <br>

                                        newsock = -1; <br>

                                } <br>

                        } <br>

                } <br>

        } <br>

} <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="193.htm">上一层</a>][<a href="283.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?