proxy.c

来自「vxworks下的sock5代理实现,c++编写」· C语言 代码 · 共 107 行

C
107
字号
#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 + =
减小字号Ctrl + -
显示快捷键?