⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcprelay.c

📁 linux下的tcpreplay源代码
💻 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 + -