📄 nettrans.cpp
字号:
// NetTrans.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <io.h>
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <iostream.h>
#include <string.h>
#include <process.h>
//#pragma comment(lib,"WS2_32.lib")
//using namespace std;
static int WSAOpenFlags=0;
CRITICAL_SECTION cs;
void OutErr(char * msg)
{
// cout<<"错误发生:" <<msg <<endl;
}
int OpenWSA(void)
{
WSADATA stWSAData;
int Ret;
if(WSAOpenFlags==0)
{
Ret = WSAStartup(0x0202, &stWSAData);
if(Ret)
{
Ret = WSAStartup(0x0101, &stWSAData);
if(Ret)
{
return 0;
}
}
}
WSAOpenFlags++;
return 1;
}
void CloseWSA(void)
{
if(WSAOpenFlags==0) return;
WSAOpenFlags--;
if(WSAOpenFlags==0)
WSACleanup();
}
SOCKET OpenSocket (void)
{
SOCKET server;
SOCKADDR_IN ser_addr;
UINT port=4000; //监听控制命令端口
// HANDLE Hnd;
int cliaddrLen=0;
ser_addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(port);
if((server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET)
{
OutErr("WSASocket");
return -1;
}
if(bind(server,(SOCKADDR *)&ser_addr,sizeof(SOCKADDR))!=0)
{
OutErr("bind");
closesocket(server);
return -1;
}
if(listen(server,5)!=0)
{
OutErr("listen");
closesocket(server);
return -1;
}
return server;
}
int PutMode(char * remote_ip,unsigned short remote_port,char * transdata,unsigned short transdatalen)
{
SOCKET c;
SOCKADDR_IN server_addr;
WSADATA wsd;
char * msg=transdata;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
OutErr("WSAStartup");
return 1;
}
if((c=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET)
{
OutErr("WSASocket");
return 1;
}
server_addr.sin_addr.S_un.S_addr=inet_addr(remote_ip);
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(remote_port);
//加超时
if(connect(c,(SOCKADDR *)&server_addr,sizeof(SOCKADDR_IN))!=0)
{
OutErr( "connect" );
return 1;
}
do
{
int SentBytes;
if((SentBytes=send(c,msg,strlen(msg),0))==SOCKET_ERROR)
{
OutErr("send");
break;
}
}while(1);
closesocket(c);
WSACleanup();
return 0;
}
//fd_set fdread;
//int ret;
unsigned _stdcall ThreadProc(LPVOID lpParameter)
{
SOCKET client_fd=(SOCKET)lpParameter;
char data[4096];
int ReadBytes=10;
UINT ReciveBytes=0;
fd_set fdread;
int ret;
FD_ZERO(&fdread);
FD_SET(client_fd,&fdread);
do
{ //这里阻断程序,知道缓冲区内有可读数据才返回
if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR)
{
OutErr("select");
break;
}
if(ret>0)
{
if(FD_ISSET(client_fd,&fdread))
{
ReciveBytes=recv(client_fd,data, ReadBytes ,0);
if(ReciveBytes==SOCKET_ERROR)
{
break;
}
// decode_data(data,ReciveBytes);
//EnterCriticalSection (&cs);
//LeaveCriticalSection(&cs);
//data[ReciveBytes]='\0';
}
}
}while(ReciveBytes>0);
FD_CLR(client_fd,&fdread);
closesocket(client_fd);
_endthread();
return 0; //
}
int main()
{
SOCKET server;
SOCKET client;
SOCKADDR_IN cli_addr;
UINT port=4000; //监听控制命令端口
HANDLE Hnd;
int cliaddrLen=0;
unsigned int dwThreadID;
if( !OpenWSA() )
{
OutErr("WSAStartup");
return 1;
}
if ((server=OpenSocket()) ==-1)
{
CloseWSA();
return 1;
}
InitializeCriticalSection(&cs);
while(1)
{
cliaddrLen=sizeof(SOCKADDR);
client=accept(server,(SOCKADDR *)&cli_addr,&cliaddrLen);
ULONG ul=1;
if(ioctlsocket(client,FIONBIO,&ul)==SOCKET_ERROR)
{
OutErr("ioctlsocket");
return 1;
}
// FD_ZERO(&fdread);//清空集合
// FD_SET(client,&fdread);// 加入到读取集合中
Hnd = (HANDLE)_beginthreadex( NULL, 0, &ThreadProc, (LPVOID)client, 0, &dwThreadID);
if(Hnd==NULL)
{
CloseHandle(Hnd);
closesocket(client);
}
}
closesocket(server);
CloseWSA();
DeleteCriticalSection (&cs);
return 0;
}
/*
#include "stdafx.h"
//#include "Proxy.h"
#include <winsock2.h> //WINSOCKET API 2。0
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <process.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
#define HTTP "http://"
#define FTP "ftp://"
#define PROXYPORT 5001 //Proxy 端口
#define BUFSIZE 10240 //缓冲区大小
//UINT ProxyToServer(LPVOID pParam);
//UINT UserToProxyThread(void *pParam);
struct SocketPair
{
SOCKET user_proxy; //socket : 本地机器到PROXY 服务机
SOCKET proxy_server; //socket : PROXY 服务机到远程主机
BOOL IsUser_ProxyClosed; // 本地机器到PROXY 服务机状态
BOOL IsProxy_ServerClosed; // PROXY 服务机到远程主机状态
};
struct ProxyParam
{
char Address[256]; // 远程主机地址
HANDLE User_SvrOK; // PROXY 服务机到远程主机的联结状态
SocketPair *pPair; // 维护一组SOCKET的指针
int Port; // 用来联结远程主机的端口
}; //这个结构用来PROXY SERVER与远程主机的信息交换.
SOCKET gListen_Socket; //用来侦听的SOCKET。
unsigned _stdcall UserToProxyThread(void *prarm);
unsigned _stdcall ProxyToServer(LPVOID pParam);
////////////////////////////////////////////////////////////////////
//
// WinSock打开记数
//
////////////////////////////////////////////////////////////////////
static int WSAOpenFlags=0;
////////////////////////////////////////////////////////////////////
//
// 打开WinSock
//
////////////////////////////////////////////////////////////////////
int OpenWSA(void)
{
WSADATA stWSAData;
int Ret;
if(WSAOpenFlags==0)
{
Ret = WSAStartup(0x0202, &stWSAData);
if(Ret)
{
Ret = WSAStartup(0x0101, &stWSAData);
if(Ret)
{
return 0;
}
}
}
WSAOpenFlags++;
return 1;
}
////////////////////////////////////////////////////////////////////
//
// 关闭WinSock
//
////////////////////////////////////////////////////////////////////
void CloseWSA(void)
{
if(WSAOpenFlags==0) return;
WSAOpenFlags--;
if(WSAOpenFlags==0)
WSACleanup();
}
int StartServer() //启动服务
{
// WSADATA wsaData;
sockaddr_in local;
SOCKET listen_socket;
unsigned int UserToProxyThreadID;
HANDLE UserToProxyThreadHandle;
if( ! OpenWSA() )
{
printf("\nError in Startup session.\n");
CloseWSA();
return -1;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(PROXYPORT);
listen_socket=socket(AF_INET,SOCK_STREAM,0);
if(listen_socket==INVALID_SOCKET)
{
printf("\nError in New a Socket.");
WSACleanup();
return -2;
}
if(::bind(listen_socket,(sockaddr *)&local,sizeof(local))!=0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -