📄 283.htm
字号:
<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="284.htm">下一篇</a>]
<hr><p align="left"><small>/* socks_funcs.c, by digger. public functions for both socks v4 and v5 */ <br>
<br>
#include <stdio.h> <br>
#include <string.h> <br>
#include <signal.h> <br>
#include <sys/types.h> <br>
#include <sys/ddi.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>
u_char ver; /* socks version, 4 or 5 */ <br>
int relay_sock = -1; /* socket relay data */ <br>
int new_svr_sock = -1; /* server socket generated by bind command */ <br>
<br>
int read_chars(int sockfd, u_char *buf, int len) <br>
{ <br>
{ <br>
int n; <br>
if ((n = read(sockfd, buf, len)) <= 0) { <br>
#ifdef DEBUG <br>
fprintf(stderr, "peer sock closed, abort reading\n"); <br>
#endif <br>
close_and_exit(sockfd); <br>
} <br>
return(n); <br>
} <br>
<br>
int write_chars(int sockfd, u_char *buf, int len) <br>
{ <br>
int n; <br>
if ((n = write(sockfd, buf, len)) < 0) { <br>
#ifdef DEBUG <br>
fprintf(stderr, "peer sock closed, abort writing\n"); <br>
#endif <br>
close_and_exit(sockfd); <br>
} <br>
return(n); <br>
} <br>
<br>
<br>
/* close all active socket and exit current process */ <br>
void close_and_exit(int sockfd) <br>
{ <br>
close(sockfd); <br>
if (new_svr_sock != -1) close(new_svr_sock); <br>
if (relay_sock != -1) close(relay_sock); <br>
exit(0); <br>
} <br>
<br>
/* get version number from socks client */ <br>
void get_version(int sockfd) <br>
{ <br>
read_chars(sockfd, &ver, 1); <br>
#ifdef DEBUG <br>
fprintf(stderr, "version: %u\n", ver); <br>
#endif <br>
} <br>
<br>
/* for CONNECT command of socks client */ <br>
int creat_connect_sock(u_long l_dst_ip, u_short dst_port) <br>
{ <br>
struct sockaddr_in dst_addr; <br>
<br>
bzero(&dst_addr, sizeof(dst_addr)); <br>
dst_addr.sin_family = AF_INET; <br>
dst_addr.sin_addr.s_addr = l_dst_ip; <br>
dst_addr.sin_port = dst_port; <br>
<br>
if ((relay_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { <br>
#ifdef DEBUG <br>
perror("relay socket"); <br>
#endif <br>
return FALSE; <br>
} <br>
#ifdef DEBUG <br>
fprintf(stderr, "creat relay socket OK\n"); <br>
#endif <br>
if (connect(relay_sock, <br>
(struct sockaddr *)&dst_addr, sizeof(dst_addr)) < 0) { <br>
#ifdef DEBUG <br>
perror("connect dst"); <br>
#endif <br>
return FALSE; <br>
} <br>
} <br>
#ifdef DEBUG <br>
fprintf(stderr, "connect dst OK\n"); <br>
#endif <br>
return TRUE; <br>
} <br>
<br>
u_long l_only_ip; <br>
u_short i_only_port; <br>
<br>
/* for BIND command of socks client */ <br>
int creat_bind_sock(u_long * l_dst_ip, u_short * dst_port) <br>
{ <br>
struct sockaddr_in me_addr; <br>
int addr_len; <br>
u_short port = 1024; <br>
<br>
l_only_ip = *l_dst_ip; <br>
i_only_port = *dst_port; <br>
<br>
if ((new_svr_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { <br>
#ifdef DEBUG <br>
perror("server socket"); <br>
#endif <br>
return FALSE; <br>
} <br>
#ifdef DEBUG <br>
fprintf(stderr, "creat server socket OK\n"); <br>
#endif <br>
for (port = 1024;port <= 5000;port ++) { <br>
<br>
bzero(&me_addr, sizeof(me_addr)); <br>
me_addr.sin_family = AF_INET; <br>
me_addr.sin_addr.s_addr = INADDR_ANY; <br>
me_addr.sin_port = port; <br>
<br>
if (bind(new_svr_sock, <br>
(struct sockaddr *)&me_addr, sizeof(me_addr)) < 0) { <br>
continue; <br>
} else { <br>
break; <br>
} <br>
} <br>
if (port > 5000) return FALSE; <br>
addr_len = sizeof(struct sockaddr_in); <br>
if (getsockname(new_svr_sock, <br>
(struct sockaddr *)&me_addr, &addr_len) < 0) { <br>
close(new_svr_sock); <br>
new_svr_sock = -1; <br>
return FALSE; <br>
} else { <br>
*l_dst_ip = me_addr.sin_addr.s_addr; <br>
*dst_port = me_addr.sin_port; <br>
} <br>
#ifdef DEBUG <br>
fprintf(stderr, "bind server OK, IP: %s, port: %u\n", <br>
inet_ntoa(me_addr.sin_addr), ntohs(me_addr.sin_port)); <br>
#endif <br>
return TRUE; <br>
} <br>
<br>
int wait_connect_in(u_long * l_dst_ip, u_short * dst_port) <br>
{ <br>
struct sockaddr_in dst_addr; <br>
int addr_len, result; <br>
<br>
listen(new_svr_sock, 5); <br>
if ((relay_sock = accept(new_svr_sock, <br>
(struct sockaddr *)&dst_addr, &addr_len)) < 0) { <br>
return FALSE; <br>
} <br>
addr_len = sizeof(struct sockaddr_in); <br>
if (getpeername(relay_sock, (struct sockaddr *)&dst_addr, <br>
&addr_len) < 0) { <br>
close(relay_sock); <br>
relay_sock = -1; <br>
return FALSE; <br>
} <br>
if (dst_addr.sin_addr.s_addr != l_only_ip || <br>
dst_addr.sin_port != i_only_port ) { <br>
close(relay_sock); <br>
relay_sock = -1; <br>
return FALSE; <br>
} <br>
if (getsockname(relay_sock, (struct sockaddr *)&dst_addr, <br>
&addr_len) < 0) { <br>
close(relay_sock); <br>
relay_sock = -1; <br>
return FALSE; <br>
} else { <br>
*l_dst_ip = dst_addr.sin_addr.s_addr; <br>
*dst_port = dst_addr.sin_port; <br>
} <br>
#ifdef DEBUG <br>
fprintf(stderr, "accept relay_sock OK, ip: %s, port: %u\n", <br>
inet_ntoa(dst_addr.sin_addr), ntohs(dst_addr.sin_port)); <br>
#endif <br>
return TRUE; <br>
} <br>
<br>
<br>
/* relay data between client and destination server that client expect */ <br>
void relay_data(int sockfd) <br>
{ <br>
int n; <br>
int fdNum; <br>
u_char buf[4096]; <br>
fd_set fdR; <br>
<br>
for(;;) { <br>
FD_ZERO( &fdR ); <br>
FD_SET(sockfd, &fdR); <br>
FD_SET(relay_sock, &fdR); <br>
<br>
fdNum = max(sockfd, relay_sock) + 1; <br>
switch(select(32, &fdR, NULL, NULL, NULL)) { <br>
<br>
case -1: <br>
if (errno == EINTR) continue; <br>
else return; <br>
<br>
case 0: /* not reached */ <br>
#ifdef DEBUG <br>
fprintf(stderr, "timeout\n"); <br>
#endif <br>
close(relay_sock); <br>
relay_sock = -1; <br>
return; <br>
default: <br>
if (FD_ISSET(sockfd, &fdR)) { <br>
n = read_chars(sockfd, buf, 512); <br>
if (n) <br>
<br>
write_chars(relay_sock, buf, n); <br>
<br>
} <br>
if FD_ISSET(relay_sock, &fdR) { <br>
n = read_chars(relay_sock, buf , 512); <br>
if (n) <br>
write_chars(sockfd, buf, n); <br>
} <br>
} <br>
} <br>
} <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="193.htm">上一层</a>][<a href="284.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -