int main(int argc, char *argv[]) { int nListenSock = -1, nLocalSock = -1, nRemoteSock = -1; pid_t nChild; if (argc != 2) /* 命令行参数:“proxy1 本地端口” */ { PrintLog(stdout, "proxy1 LOCALPORT\n"); return 1; } /* ---------------------------父进程------------------------------- */ /* ① 创建侦听套接字 */ ASSERT(CreateSock(&nListenSock, atoi(argv[1]), 8) == 0); PrintLog(stdout, "listen service: service is activated."); InitServer(); /* ② 进程转后台运行 */ while (1) { /* ③ 等待并创建连接套接字 */ if (!VERIFY(AcceptSock(&nLocalSock, nListenSock) == 0)) continue; /* ③ 继续等待 */ VERIFY((nChild = fork()) >= 0); /* ④ 创建子进程 */ if (nChild == 0) break; /* 子进程跳转到子进程代码 */ close(nLocalSock); /* ⑤ 父进程关闭连接套接字 */ } /* ---------------------------子进程------------------------------- */ close(nListenSock); /* ⑦ 子进程关闭侦听套接字 */ /* 解析HTTP报文头,并与目标服务器建立连接 */ if (HttpConnect(nLocalSock, &nRemoteSock) == 0) SendReciveServer(nLocalSock, nRemoteSock); /* 通信转发 */ if (nLocalSock >= 0) close(nLocalSock); /* ⑨ 子进程关闭本地端套接字 */ if (nRemoteSock >= 0) close(nRemoteSock);/* ⑨ 子进程关闭目标端套接字 */ }
int main() { int nSock, nSock1; pid_t nChild; char buf[2048], szAddr[30]; memset(buf, 0, sizeof(buf)); ASSERT(CreateSock(&nSock, 9001, 9) == 0); while(1) { ASSERT(AcceptSock(&nSock1, nSock) == 0); nChild = fork(); if (nChild == 0) { break; } close(nSock1); } close(nSock); memset(szAddr, 0, sizeof(szAddr)); LocateRemoteAddr(nSock1, szAddr); recv(nSock1, buf, sizeof(buf), 0); PrintLog(stderr, buf); sprintf(buf, "HTTP/1.1 200 OK\n%s%s%s", szHtml1, szAddr, szHtml2); send(nSock1, buf, strlen(buf), 0); PrintLog(stderr, buf); close(nSock1); }
int main() { int nSock,nSock1; char buf[2048]; //创建端口号为9001的侦听套接字 VERIFY(CreateSock(&nSock,9001,9) != 0, "Create Listen SOCKET"); //接收客户端连接申请,创建连接套接字nSock1 VERIFY(AcceptSock(&nSock1,nSock) != 0,"Link"); memset(buf,0,sizeof(buf)); //接收客户端发送的TCP数据消息 recv(nSock1,buf,sizeof(buf),0); fprintf(stderr,buf); close(nSock); //关闭侦听套接字 close(nSock1); //关闭连接套接字 return 0; }