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

📄 nettrans.cpp

📁 通过用SOCKET发包来实现PING命令
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -