⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy.c

📁 vxworks下的sock5代理实现,c++编写
💻 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 + -