/* --- 解析HTTP报文头,并与目标服务器建立连接 --- */ int HttpConnect(int nLocalSock, int *nRemoteSock) { char szIp[30], buf[4096]; int nread; memset(buf,0,sizeof(buf)); /* 接收网页浏览端发送的数据请求 */ while ((nread = read(nLocalSock, buf, sizeof(buf))) < 0) { if (errno != EINTR) /* 信号导致read中断,继续接收 */ { perror("read"); /* 其它错,结束子进程 */ return 1; } } memset(szIp, 0, sizeof(szIp)); /* 解析HTTP报文,简单验证报文,并获取目标服务器的IP地址 */ if (GetObjectIp(buf, szIp) != 0) return 2; /* 连接目标服务器,端口80(网页浏览端口) */ if (!VERIFY(ConnectSock(nRemoteSock, 80, szIp) == 0)) { PrintLog(stderr, "Connect Server Fail,Addr[%s]", szIp); return 3; /* 连接目标端失败,结束子进程 */ } if (WriteFile(*nRemoteSock, buf, nread) != 0) /* 转发数据 */ { PrintLog(stderr, "Write message to server error[%d]", nread); perror("write"); /* 数据转发失败,结束子进程 */ return 4; } return 0; /* 成功返回 */ }
int main(int argc, char **argv) { int server_sock, session_sock; if (argc > 1) TestInit(0); server_sock = OpenUDPSocket( 1701 ); session_sock = OpenPPPoL2TPSocket(); /* Try sending packets first to see if that helps */ // SendRawPacket( server_sock, 1701, control_packet, sizeof( control_packet ) ); // SendRawPacket( server_sock, 1701, data_packet, sizeof( data_packet ) ); fcntl( server_sock, F_SETFL, O_NONBLOCK ); fcntl( session_sock, F_SETFL, O_NONBLOCK ); CheckPipe( server_sock ); ConnectSock( session_sock, server_sock, 1701, 1, 2, 3, 4 ); system( "./subtest-proc" ); SendRawPacket( server_sock, 1701, control_packet, sizeof( control_packet ) ); SendRawPacket( server_sock, 1701, data_packet, sizeof( data_packet ) ); system( "./subtest-proc" ); CheckPipe( server_sock ); CheckPipe( session_sock ); system( "./subtest-proc" ); /* Close session socket first, because other way round breaks right now */ TestPrintf( "Closing session socket\n" ); close( session_sock ); TestPrintf( "Closing server socket\n" ); close( server_sock ); return 0; }
int main(int argc, char **argv) { int server_sock1, session_sock1; int server_sock2, session_sock2; if (argc > 1) TestInit(0); server_sock1 = OpenUDPSocket( 1701 ); session_sock1 = OpenPPPoL2TPSocket(); server_sock2 = OpenUDPSocket( 1702 ); session_sock2 = OpenPPPoL2TPSocket(); #if 0 /* Try sending packets first to see if that helps */ SendTestPacket( server_sock1, 1702 ); SendTestPacket( server_sock2, 1701 ); #endif fcntl( server_sock1, F_SETFL, O_NONBLOCK ); fcntl( session_sock1, F_SETFL, O_NONBLOCK ); fcntl( server_sock2, F_SETFL, O_NONBLOCK ); fcntl( session_sock2, F_SETFL, O_NONBLOCK ); fcntl( server_sock1, F_SETFD, FD_CLOEXEC ); fcntl( session_sock1, F_SETFD, FD_CLOEXEC ); fcntl( server_sock2, F_SETFD, FD_CLOEXEC ); fcntl( session_sock2, F_SETFD, FD_CLOEXEC ); CheckPipe( server_sock1 ); CheckPipe( server_sock2 ); ConnectSock( session_sock1, server_sock1, 1702, 1, 2, 3, 4 ); ConnectSock( session_sock2, server_sock2, 1701, 3, 4, 1, 2 ); system( "./subtest-proc" ); SendTestPacket( session_sock1, 1702 ); SendTestPacket( session_sock2, 1701 ); system( "./subtest-proc" ); CheckPipe( server_sock1 ); CheckPipe( session_sock1 ); CheckPipe( server_sock2 ); CheckPipe( session_sock2 ); if (argc == 0) { StartLoopingFunction( session_sock1, 0, 0 ); StartLoopingFunction( session_sock2, 0, 0 ); StartLoopingFunction( server_sock1, 1702, 0 ); StartLoopingFunction( server_sock2, 1701, 0 ); } else { StartLoopingFunction( session_sock1, 0, 1000 ); StartLoopingFunction( session_sock2, 0, 2000 ); StartLoopingFunction( server_sock1, 1702, 3000 ); StartLoopingFunction( server_sock2, 1701, 4000 ); } if (argc == 0) { char buf[16]; fprintf( stdout, "Press any key to continue\n" ); fgets( buf, 10, stdin ); } else { fprintf(stdout, "Waiting 60 seconds...\n"); sleep(60); } system( "./subtest-proc" ); TestPrintf( "Closing server2 socket\n" ); close( server_sock2 ); TestPrintf( "Closing session2 socket\n" ); close( session_sock2 ); TestPrintf( "Closing session1 socket\n" ); close( session_sock1 ); TestPrintf( "Closing server1 socket\n" ); close( server_sock1 ); return 0; }
void ZZZ() {ConnectSock();};