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

📄 proxyd.c

📁 PROXY 在UNIX下的TCP转发程序
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/fcntl.h>
#include <sys/signal.h>
#include <sys/timeb.h>
#include <stdarg.h>

EXEC SQL INCLUDE SQLCA;
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL WHENEVER SQLWARNING CONTINUE;
EXEC SQL WHENEVER NOT FOUND CONTINUE;

# define WHITES  " \n\t\r"
# define SQLCODE        sqlca.sqlcode
# define SQLNOTFOUND    100

char	ap_name[20+1];

void WaitChild(int sig)
{
        int status;
        waitpid(0,&status,WNOHANG);
	signal(sig,WaitChild);
}

void write_log10(char *fmt, ...)
{
	va_list	args;
	FILE *fp = NULL;
	
	if( fp == NULL )
	{
		char log_file[216];
		sprintf( log_file, "%s/log/%s.%8ld", getenv("HOME"),lower(ap_name),CurrentDate());
		if( (fp = fopen( log_file, "a" )) == NULL )
			fp = stderr;
	}
	
	fprintf( fp,  "%06ld%05ld", CurrentTime(), getpid());
	va_start(args, fmt);
	vfprintf(fp, fmt, args);
	fprintf(fp, "\n");
	va_end(args);
	fflush(fp);
	fclose(fp);

	return;
}

void write_log16(char* buf,int len)
{
	int  ii,jj;

	for(ii=0;ii<len;ii++)
	{
		printf("[%02X]",*(buf+ii));
	}
	return;
}

void write_log1610(char* buf,int len)
{
	char linebuf[265+1];
	int  ii,jj;
	char hxbuf[8+1+1],ascbuf[1+1];

	memset(linebuf,0,sizeof(linebuf));
	memset(linebuf,' ',48);

	for(ii=0;ii<len;ii++)
	{
		jj = ii%16;
		if(ii>0 && jj==0)
		{
			write_log10("-%03X:%s",(ii/16-1)*16,linebuf);
			memset(linebuf,0,sizeof(linebuf));
			memset(linebuf,' ',48);
		}
		memset(hxbuf,0,sizeof(hxbuf));
		memset(ascbuf,0,sizeof(ascbuf));

		sprintf(hxbuf,"%08X ",*(buf+ii));

		//if(*(buf+ii) < 0x20)
		if(*(buf+ii) == 0 || *(buf+ii) == '\t' || *(buf+ii) == '\b')
			sprintf(ascbuf,".",*(buf+ii));
		else
			sprintf(ascbuf,"%c",*(buf+ii));

		memcpy(linebuf+3*jj,hxbuf+6,3);
		memcpy(linebuf+48+jj,ascbuf,1);
		//fprintf(stderr,"linebuf=[%s]\n",linebuf);
	}
	if(ii>0)
		write_log10("-%03X:%s",(ii/16)*16,linebuf);
	return;
}

int main(int argc,char** argv) 
{
	int	server;
	int	ret;
	char	buf[1024];
        strcpy(ap_name,"proxyd");

	if(argc != 5)
	{
		fprintf(stderr,"usage: %s <proxyd port> <active host> <active port> <active timeout> \n",argv[0]);
		exit(1);
	}
	

	server = TCPListen(atol(argv[1]),5);
	if(server <= 0)
	{
		fprintf(stderr,"TCPListen failed with [%s]\n",argv[1]);
		exit(2);
	}

	if(fork()>0)	exit(0);
	setpgrp();

	for(;;)
	{
		int proxyd,sockfd,exit_flag;
		char headbuf[128+1];

		proxyd = TCPAccept(server);
		if(proxyd <= 0)
		{
			continue;
		}
		if(fork()>0)	
		{
			TCPClose(proxyd);
			signal(SIGCLD,WaitChild);
			continue;
		}
		TCPClose(server);

		sockfd = TCPConnect(argv[2],atol(argv[3]),atol(argv[4]));

		if(sockfd <= 0)
		{
			//write_log10("连接生产数据库服务器失败 [%s,%s,%s]\n",argv[2],argv[3],argv[4]);
			TCPClose(proxyd);
			exit(3);
		}

		sprintf(headbuf,"%05ld %08X SESSION BEGIN",getpid(),0);
		//write_log1610(headbuf,strlen(headbuf));

		exit_flag = 0;
		for(;;)
		{
			int mask,ret;
			char buf[4096];
			fd_set rset;

			FD_ZERO(&rset);

			FD_SET(proxyd,&rset);
			FD_SET(sockfd,&rset);

			ret = select(32,&rset,NULL,NULL,NULL);

			if(FD_ISSET(proxyd,&rset))
			{
				memset(buf,0,sizeof(buf));
				ret = read(proxyd,buf,sizeof(buf));
				if(ret <= 0) break;
				write(sockfd,buf,ret);

				memset(headbuf,0,sizeof(headbuf));
				sprintf(headbuf,"%05ld %08X SEND",getpid(),ret);
				//write_log1610(headbuf,strlen(headbuf));
				//write_log1610(buf,ret);
				//write_log("****[%s]****",buf);
			}
			if(FD_ISSET(sockfd,&rset))
			{
				memset(buf,0,sizeof(buf));
				ret = read(sockfd,buf,sizeof(buf));
				if(ret <= 0) break;
				write(proxyd,buf,ret);

				sprintf(headbuf,"%05ld %08X RECV",getpid(),ret);
				//write_log1610(headbuf,strlen(headbuf));
				//write_log1610(buf,ret);
				//write_log("****[%s]****",buf);
			}
		}

		sprintf(headbuf,"%06ld %06ld SESSION END",getpid(),0);
		//write_log1610(headbuf,strlen(headbuf));


		/* 确保无数据可读 */

		TCPClose(sockfd);
		TCPClose(proxyd);

		exit(0);
	}
}

⌨️ 快捷键说明

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