📄 proxyd.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 + -