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 + -
显示快捷键?