📄 proxy.c
字号:
#include "proxy.h"int proxy(int argc, char ** argv){ int listenfd, connfd,remotefd; int clilen; struct sockaddr_in cliaddr, servaddr, remoteaddr, bindaddr; struct cli_method climet; struct ser_method sermet; struct cli_req clireq; int recvnum, sendnum,len,maxfdp1; char methods[256]; char buff[1024]; fd_set rset; struct timeval tv = {100,0}; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); bzero(buff, sizeof(buff)); bzero(methods, sizeof(methods)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PROXY_PORT); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); listen(listenfd, 1024); for(;;){ clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); close(listenfd); recvnum = recv(connfd, &climet, sizeof(climet),0); if(climet.version != 5) { printf("Server only support version 5\n"); goto err; } if(recvnum < sizeof(climet)) goto err; recvnum = recv(connfd, methods, climet.nmethods, 0); /*printf("read %d,\n", recvnum); if(recvnum < climet.nmethods) goto err; */ sermet.version = climet.version; sermet.method = 0; sendnum = send(connfd, &sermet, sizeof(sermet),0); /* printf("write %d,\n", sendnum); if(sendnum < sizeof(sermet)) goto err; */ recvnum = recv(connfd, &clireq, sizeof(clireq),0); if(recvnum ==0) printf("read error\n"); /*if(recvnum < sizeof(clireq)) goto err; */ if(clireq.atyp != 1) { printf("Server only support ip V4\n"); goto err; } remotefd = socket(AF_INET, SOCK_STREAM, 0); bzero(&remoteaddr, sizeof(remoteaddr)); remoteaddr.sin_family = AF_INET; remoteaddr.sin_port = clireq.port; remoteaddr.sin_addr.s_addr = clireq.ipv4addr.s_addr; connect(remotefd, (struct sockaddr *)&remoteaddr, sizeof(remoteaddr)); len = sizeof(bindaddr); if(getsockname(remotefd, (struct sockaddr *)&bindaddr, &len)<0) goto err; clireq.cmd = 0; clireq.ipv4addr.s_addr = bindaddr.sin_addr.s_addr; clireq.port = bindaddr.sin_port; send(connfd, &clireq, sizeof(clireq),0); FD_ZERO(&rset); for(;;){ FD_SET(connfd, &rset); FD_SET(remotefd, &rset); maxfdp1 = (connfd > remotefd?connfd:remotefd) +1; select(maxfdp1, &rset, NULL, NULL, &tv); if(FD_ISSET(connfd, &rset)){ recvnum = recv(connfd, buff, sizeof(buff), 0); send(remotefd, buff, recvnum, 0); } else{ recvnum = recv(remotefd, buff, sizeof(buff), 0); send(connfd, buff, recvnum, 0); } } }err: close(connfd); close(listenfd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -