?? tcprelay.c
字號:
/* tcprelay v1.0 by james@ustc.edu.cn 2004.12.19 http://www.ustc.edu.cn/~james/tcprelay/*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/ip.h>#include <netinet/tcp.h>#include <linux/if.h>#include <linux/if_ether.h>#include <linux/if_packet.h>#include "sock.h"#define MAXLEN 16384// #define DEBUG 1char *laddr,*lport,*raddr,*rport;unsigned long fwd,rfwd;int r_fd, c_fd;char scaddr[MAXLEN],sladdr[MAXLEN],sraddr[MAXLEN],srcaddr[MAXLEN];char * PrintAddr(struct sockaddr *sa){ struct sockaddr_in *sa_in; struct sockaddr_in6 *sa_in6; static char buf[MAXLEN]; char buf2[MAXLEN]; if(sa->sa_family==AF_INET) { sa_in = (struct sockaddr_in*)sa; snprintf(buf,MAXLEN,"%s:%d", inet_ntop(sa_in->sin_family,&sa_in->sin_addr,buf2,MAXLEN), ntohs(sa_in->sin_port)); } else if(sa->sa_family==AF_INET6) { sa_in6 = (struct sockaddr_in6 *)sa; snprintf(buf,MAXLEN,"%s:%d", inet_ntop(sa_in6->sin6_family,&sa_in6->sin6_addr,buf2,MAXLEN), ntohs(sa_in6->sin6_port)); } else snprintf(buf,MAXLEN,"unknow family %d",sa->sa_family); return buf;}void PrintStats(void){ syslog(LOG_INFO,"%s->%s ",scaddr,sladdr); syslog(LOG_INFO,"==> %s->%s\n",srcaddr,sraddr); syslog(LOG_INFO,"===> %8lu bytes\n",fwd); syslog(LOG_INFO,"<=== %8lu bytes\n",rfwd);}void Process(int c_fd) { fd_set rset; struct timeval tv; char buffer[MAXLEN]; int m,n; int max_fd; struct sockaddr_in6 sa; int salen; fwd=rfwd=0; r_fd= Tcp_connect(raddr,rport); scaddr[0]=sladdr[0]=sraddr[0]=srcaddr[0]=0; salen=sizeof(sa); if(getpeername(c_fd,(struct sockaddr*)&sa,&salen)==0) strncpy(scaddr,PrintAddr((struct sockaddr*)&sa),MAXLEN); salen=sizeof(sa); if(getsockname(c_fd,(struct sockaddr*)&sa,&salen)==0) strncpy(sladdr,PrintAddr((struct sockaddr*)&sa),MAXLEN); salen=sizeof(sa); if(getpeername(r_fd,(struct sockaddr*)&sa,&salen)==0) strncpy(sraddr,PrintAddr((struct sockaddr*)&sa),MAXLEN); salen=sizeof(sa); if(getsockname(r_fd,(struct sockaddr*)&sa,&salen)==0) strncpy(srcaddr,PrintAddr((struct sockaddr*)&sa),MAXLEN); while (1) { FD_ZERO(&rset); FD_SET(c_fd, &rset); FD_SET(r_fd, &rset); max_fd = max(c_fd,r_fd); tv.tv_sec = 300; tv.tv_usec = 0; m = Select (max_fd + 1, &rset, NULL, NULL, &tv); if (m == 0) continue; if (FD_ISSET(r_fd, &rset)) { n = recv (r_fd, buffer, MAXLEN,0); if(n<=0) { PrintStats(); exit(0); } Write(c_fd, buffer, n); rfwd+=n; } if (FD_ISSET(c_fd, &rset)) { n = recv (c_fd, buffer, MAXLEN,0); if(n<=0) { PrintStats(); exit(0); } Write(r_fd, buffer, n); fwd+=n; } }}void usage(){ printf("\ntcprelay v1.0 - tcp relay by james@ustc.edu.cn\n"); printf("\n http://www.ustc.edu.cn/~james/tcprelay\n"); printf("\ntcprelay local_address local_port remote_address remote_port\n\n"); exit(0);}int main(int argc, char *argv[]){ int listen_fd; int llen; signal(SIGCHLD,SIG_IGN); if(argc!=5) usage(); laddr=argv[1]; lport=argv[2]; raddr=argv[3]; rport=argv[4]; printf("tcprelay %s:%s -> %s:%s\n", laddr,lport,raddr,rport);#ifndef DEBUG daemon_init("tcprelay",LOG_DAEMON);#endif listen_fd = Tcp_listen(laddr,lport,&llen); while (1) { struct sockaddr sa; int slen; slen = sizeof(sa); c_fd = Accept(listen_fd, &sa, & slen);#ifdef DEBUG Process(c_fd);#else if( Fork()==0 ) { Close(listen_fd); Process(c_fd); }#endif Close(c_fd); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -