#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
typedef struct _MySocket {
SOCKET sockfrom;
SOCKET sockto;
}MySocket;
typedef struct _SockAddr {
SOCKET sock;
int port;
char ip[16];
}SockAddr;
#define MAXBUFFER 4096
#define MAXUSERS 10
#define PORT 8000
bool initSocket(void);
DWORD WINAPI ProxyThread(LPVOID lparam) ;
SOCKET CreateSocketServer(int listenPort);
SOCKET CreateSocketClient(char *addrConnect,int port);
void StartProxy(int localPort,int remotePort,char *remoteAddr);
void closeSock(MySocket sock);
//代理线程函数
DWORD WINAPI ProxyThread(LPVOID lparam) {
//MySocket mysock=*(MySocket *)lparam;
SockAddr mysockaddr=*(SockAddr *)lparam;
char buf[MAXBUFFER];
int ret,cnum;
fd_set fdread;
MySocket mysock;
mysock.sockfrom=mysockaddr.sock;
mysock.sockto=CreateSocketClient(mysockaddr.ip,mysockaddr.port);
while (1) {
FD_ZERO(&fdread);
FD_SET(mysock.sockfrom,&fdread);
FD_SET(mysock.sockto,&fdread);
ret=select(0,&fdread,NULL,NULL,NULL);
if (ret<=0) {
closeSock(mysock);
break;
}
if (FD_ISSET(mysock.sockfrom,&fdread)) {
cnum=recv( mysock.sockfrom,buf,strlen(buf),0);
if (cnum==SOCKET_ERROR) {
closeSock(mysock);
break;
}
cnum=send(mysock.sockto,buf,cnum,0);
if (cnum==SOCKET_ERROR) {
closeSock(mysock);
break;
}
continue;
}
if (FD_ISSET(mysock.sockto,&fdread)) {
cnum=recv(mysock.sockto,buf,strlen(buf),0);
if (cnum==SOCKET_ERROR) {
closeSock(mysock);
break;
}
cnum=send( mysock.sockfrom,buf,cnum,0);
if (cnum==SOCKET_ERROR) {
closeSock(mysock);
break;
}
continue;
}
}
return 0;
}
bool initSocket(void)
{
WSADATA wsadata;
WORD version;
version = MAKEWORD(2,2);
if(WSAStartup( version , &wsadata )!= 0) {
return FALSE;
}
return TRUE;
}
SOCKET CreateSocketServer(int listenPort) {
SOCKET sock;
struct sockaddr_in addrServer;
bool optval=TRUE;
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock==SOCKET_ERROR) {
printf ("Create Socket Failed!\n");
return -1;
}
addrServer.sin_family=AF_INET;
addrServer.sin_addr.s_addr=htonl(INADDR_ANY);
addrServer.sin_port=htons(listenPort);
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)optval,sizeof(optval));
if (bind(sock,(struct sockaddr *)&addrServer,sizeof(struct sockaddr))==SOCKET_ERROR) {
printf ("Bind Socket Failed!\n");
return -1;
}
return sock;
}
SOCKET CreateSocketClient(char *addrConnect,int port) {
SOCKET sock;
struct sockaddr_in addrRemote;
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addrRemote.sin_family=AF_INET ;
addrRemote.sin_port=htons(port);
addrRemote.sin_addr.s_addr=inet_addr(addrConnect);
if (connect(sock,(struct sockaddr *)&addrRemote,sizeof(addrRemote))==SOCKET_ERROR) {
printf ("Connect to remote failed!\n");
return -1;
}
return sock;
}
void StartProxy(int localPort,int remotePort,char *remoteAddr) {
MySocket mysock;
SockAddr mysockaddr;
SOCKET localSock,remoteSock,newSock;
struct sockaddr addrClient;
int sizeAddrClient=sizeof(addrClient);
HANDLE h;
if (!initSocket()) {
printf ("initial socket failed!\n");
return;
}
localSock=CreateSocketServer(localPort);
strcpy(mysockaddr.ip ,remoteAddr);
mysockaddr.port=remotePort;
listen(localSock,MAXUSERS);
printf ("listening...\n");
while (1) {
newSock=accept(localSock,&addrClient,&sizeAddrClient);
if (newSock==SOCKET_ERROR) {
printf ("accept failed!\n");
break;
}
mysockaddr.sock=newSock;
h=CreateThread(NULL,0,&ProxyThread,(LPVOID *)&mysockaddr,0,NULL);
if (h==NULL) {
printf ("Create Thread failed!\n");
break;
}
WaitForSingleObject(h,0);
}
}
void closeSock(MySocket sock) {
closesocket(sock.sockfrom);
closesocket(sock.sockto);
ExitThread(0);
}
void help() {
char buf[255];
printf("Myproxy.exe remoteip remoteport [localport]\n");
printf ("eg:MyProxy.exe 192.168.0.1 80 8080\n");
printf ("********Write by Jokerfox****************\n");
printf ("*********[email protected]******************\n ");
}
int main(int argc,char **argv) {
int localport,remoteport;
if (argc!=3&&argc!=4) {
help();
exit(0);
}
if (argc==3) {
localport=PORT;
}else {
localport=atoi(argv[3]);
if (localport==0) {
help();
exit(0);
}
}
remoteport=atoi(argv[2]);
if (remoteport==0) {
help();
exit(0);
}
StartProxy(localport,remoteport,argv[1]);
return 0;
}