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

📄 qqicmp.cpp

📁 一个完成端口的例子
💻 CPP
字号:
#include <iostream.h>
#include <winsock2.h>
#include <windows.h>
#include <mstcpip.h>

#pragma comment (lib,"ws2_32")
#define maxsize 64*1024

typedef struct ipheader
{
	unsigned char  h_lenver;
	unsigned char  tos;
	unsigned short total_len;
	unsigned short ident;
	unsigned short frag_and_flags;
	unsigned char  ttl;
	unsigned char  proto;
	unsigned short checksum;
	unsigned int   sourceip;
	unsigned int   destip;
}ipheader;

typedef struct icmpheader
{
	unsigned char   type;
	unsigned char   code;
	unsigned short  checksum;
	unsigned short  seq;
	unsigned short  id;
}icmpheader;

unsigned short checksum(unsigned short *buffer,int size)
{
	unsigned long cksum=0;
	while(size>0)
	{
		cksum+=*buffer++;
		size-=sizeof(unsigned short);
	}
	if(size)
		cksum+=*(unsigned char *)buffer;
	cksum=(cksum>>16)+(cksum & 0xffff);
	cksum+=(cksum>>16);
	return (unsigned short)(~cksum);
}

void start()
{
	cout<<"            ---------------------------------------------------\n";
	cout<<"              ||                                           || \n";
	cout<<"              ||             QQicmp (ICMP转发)             || \n";
	cout<<"              ||                                           || \n";
	cout<<"              ||         Author:TOo2y     SafeChina        || \n";
	cout<<"              ||                                           || \n";
	cout<<"            ---------------------------------------------------"<<endl;
}

void usage()
{
    cout<<"\nUsage:\r\n\tQQicmp  -l[-g]  ip  port"<<endl;
	cout<<"\tQQicmp  -h"<<endl;
	cout<<"Example:\r\n";
	cout<<"\tQQicmp  -l  192.168.0.1     8000"<<endl;
	cout<<"\tQQicmp  -g  61.144.238.156  11282"<<endl;
	cout<<"Attention:"<<endl;
	cout<<"\t选项 -l :  运行于本机上,ip填网关地址,port为本地监听客户端端口;"<<endl;
    cout<<"\t选项 -g :  运行于网关上,ip填腾讯服务器地址,port为自定义端口;"<<endl;
	cout<<"\t选项 -h :  查看相关帮助文件。"<<endl;
}

int    addrlen=sizeof(struct sockaddr_in);
SOCKET sock[2][2];
struct sockaddr_in sin[2][4],sag,sal,tempr,temps;

DWORD WINAPI u2i(LPVOID num)
{
	UNREFERENCED_PARAMETER(num);
    char   msgrecv[maxsize]={0},msgsend[maxsize]={0};
	fd_set fdread,fdwrite;
	int    iret,ret,istbcs=0,ileft,idx=0;
    struct icmpheader icmphdr;

	memset(&icmphdr,0,sizeof(icmphdr));
	icmphdr.code=0;
	icmphdr.id=htons(65456);
	icmphdr.seq=htons(65456);
    icmphdr.type=0;
	icmphdr.checksum=checksum((unsigned short *)&icmphdr,sizeof(icmphdr)); 

	if((sock[0][1]=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==INVALID_SOCKET)
	{
		cout<<"Socket sock[0][1] Error: "<<GetLastError()<<endl;
		return -1;
	}
	if(bind(sock[0][1],(struct sockaddr *)&sin[0][2],addrlen)==SOCKET_ERROR)
	{
		cout<<"Bind sock[0][1] Error: "<<GetLastError()<<endl;
		return -1;
	}

	while(1)
	{
		FD_ZERO(&fdread);
		FD_ZERO(&fdwrite);
		FD_SET(sock[0][0],&fdread);
		FD_SET(sock[0][1],&fdwrite);

		if((ret=select(0,&fdread,&fdwrite,NULL,NULL))==SOCKET_ERROR)
		{
			cout<<"Select in thread 0 Error: "<<GetLastError()<<endl;
			break;
		}
		if(ret>0)
		{
			if(FD_ISSET(sock[0][0],&fdread))
			{
				iret=recvfrom(sock[0][0],msgrecv,sizeof(msgrecv),0,(struct sockaddr *)&tempr,&addrlen);
				if(iret==SOCKET_ERROR)
				{
					cout<<"\nRecvfrom sock[0][0] Error: "<<GetLastError()<<endl;
					break;
				}
				else if(iret==0)
				{
					break;
				}
				
				if(tempr.sin_port!=sin[0][0].sin_port)     
				{
					sin[0][0].sin_port=tempr.sin_port;
					sin[1][3].sin_port=tempr.sin_port;
				}

				cout<<"\nThread 0 Recv "<<iret<<" bytes from\t"<<inet_ntoa(tempr.sin_addr)<<endl;
				if(istbcs==0)
				{
                    memset(msgsend,0,sizeof(msgsend));
                	memcpy(msgsend,&icmphdr,sizeof(icmphdr));
                    istbcs+=sizeof(icmphdr);
				}
				memcpy(msgsend+istbcs,msgrecv,iret);
				istbcs+=iret;
				memset(msgrecv,0,sizeof(msgrecv));
			}
			else if(FD_ISSET(sock[0][1],&fdwrite))
			{
                ileft=istbcs;
				idx=0;
                while(ileft>0)   
				{

		    	if(sin[0][3].sin_addr.s_addr==htonl(0))          
				{
					cout<<"sin[0][3].sin_addr.s_addr==htonl(0)"<<endl;
					istbcs=0;                                      
					memset(msgsend,0,sizeof(msgsend));
					break;
				}

				iret=sendto(sock[0][1],&msgsend[idx],ileft,0,(struct sockaddr *)&sin[0][3],addrlen);
				if(iret==SOCKET_ERROR)
				{
					cout<<"Sendto sock[0][1] Error: "<<GetLastError()<<endl;
					break;
				}
				else if(iret==0)
					break;

				cout<<"Thread 0 send "<<iret<<" bytes  to \t"<<inet_ntoa(sin[0][3].sin_addr)<<endl;
				ileft-=iret;
				idx+=iret;
				}
				memset(msgsend,0,sizeof(msgsend));
				istbcs=0;
			    }
			Sleep(20);
		}
	}
	return 0;
}

DWORD WINAPI i2u(LPVOID num)
{
    UNREFERENCED_PARAMETER(num);
    fd_set  fdread,fdwrite;
	char    msgrecv[maxsize]={0},msgsend[maxsize]={0};
	int     ret,iret,idx,istbcs=0,ileft;
	DWORD   dwbufferlen[10];
	DWORD   dwbufferinlen=1;
	DWORD   dwbytesreturned=0;
    struct  ipheader   *iphdr;
	struct  icmpheader *icmphdr;

	if((sock[1][0]=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
	{
		cout<<"Socket sock[1][0] Error: "<<GetLastError()<<endl;
		return -1;
	}
	if(bind(sock[1][0],(struct sockaddr *)&sin[1][1],addrlen)==SOCKET_ERROR)
	{
		cout<<"Bind sock[1][0] Error: "<<GetLastError()<<endl;
		return -1;
	}

	WSAIoctl(sock[1][0],SIO_RCVALL,&dwbufferinlen,sizeof(dwbufferinlen),&dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,NULL,NULL);
    iphdr=(struct ipheader *)msgrecv;
	icmphdr=(struct icmpheader *)(msgrecv+sizeof(struct ipheader));

	while(1)
	{
		FD_ZERO(&fdread);
		FD_ZERO(&fdwrite);
		FD_SET(sock[1][0],&fdread);
		FD_SET(sock[1][1],&fdwrite);

		if((ret=select(0,&fdread,&fdwrite,NULL,NULL))==SOCKET_ERROR)
		{
			cout<<"Select in thread 1 Error: "<<GetLastError()<<endl;
			break;
		}
		if(ret>0)
		{
			if(FD_ISSET(sock[1][0],&fdread))
			{
				iret=recvfrom(sock[1][0],msgrecv,sizeof(msgrecv),0,(struct sockaddr *)&temps,&addrlen);
				if(iret==SOCKET_ERROR)
				{
					cout<<"Recvfrom sock[1][0] Error: "<<GetLastError()<<endl;
					break;
				}

				if(iret<=28)                    
				{
					break;
				}
				if((icmphdr->type!=0) || (icmphdr->code!=0) || ((icmphdr->id)!=htons(65456)) || ((icmphdr->seq)!=htons(65456)))
				{
					break;
				}
				if((sin[1][0].sin_addr.s_addr!=htonl(0)) && (sin[1][0].sin_addr.s_addr!=temps.sin_addr.s_addr))
					break;
				else if(sin[1][0].sin_addr.s_addr==htonl(0))          
				{
					sin[1][0].sin_addr.s_addr=temps.sin_addr.s_addr;
					sin[0][3].sin_addr.s_addr=temps.sin_addr.s_addr;
				}
 
				cout<<"\nThread 1 Recv "<<iret<<" bytes from \t"<<inet_ntoa(temps.sin_addr)<<endl;

				memcpy(msgsend+istbcs,msgrecv,iret);
				istbcs+=iret;
				memset(msgrecv,0,sizeof(msgrecv));
			}
			else if(FD_ISSET(sock[1][1],&fdwrite))
			{
				ileft=istbcs-28;
				idx=28;

				while(ileft>0)
				{
					iret=sendto(sock[1][1],&msgsend[idx],ileft,0,(struct sockaddr *)&sin[1][3],addrlen);
					if(iret==SOCKET_ERROR)
					{
						cout<<"Sendto sock[1][1] Error: "<<GetLastError()<<endl;
						break;
					}
					else if(iret==0)
						break;

					cout<<"Thread 1 send "<<iret<<" bytes  to  \t"<<inet_ntoa(sin[1][3].sin_addr)<<endl;
					ileft-=iret;
					idx+=iret;
				}
				istbcs=0;
				memset(msgsend,0,sizeof(msgsend));
			}
			Sleep(20);
		}
	}
	return 0;
}


int main(int argc,char *argv[])
{
	WSADATA      wsa;
    BOOL         gl;
	HANDLE       hthreads[2];
	DWORD        hthreadid[2]; 
    struct       hostent *hp;
	char         cname[100];
	int          dwret,log;

	system("cls.exe");
	start();

	if(argc==2)
	{
		if(strcmp(argv[1],"-h")==0)
		{
			if((int)ShellExecute(NULL,"open","help.txt",NULL,NULL,SW_SHOWMAXIMIZED)<=32)
				if(GetLastError()==ERROR_FILE_NOT_FOUND)
				{
	     			cout<<"Could not find help.txt !"<<endl;
	    			return -1;
				}
			return 0;
		}
		else
		{
			usage();
			return -1;
		}
	}
	else if(argc!=4)
	{
		usage();
		return -1;
	}
	if(!strcmp(argv[1],"-g"))
		gl=true;
	else if(!strcmp(argv[1],"-l"))
		gl=false;
	else
	{
		usage();
		return -1;
	}

	if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
	{
		cout<<"WSAStartup Error: "<<GetLastError()<<endl;
		return -1;
	}

	gethostname(cname,sizeof(cname));
    hp=gethostbyname(cname);
	for(int ipnum=0;hp->h_addr_list[ipnum]!=NULL;ipnum++)
    	sag.sin_addr=*(in_addr *)hp->h_addr_list[ipnum];
	sag.sin_family=AF_INET;
	sag.sin_port=htons(65456);

	sal=sag;
    if(ipnum>1)
		sal.sin_addr=*(in_addr *)hp->h_addr_list[ipnum-2];

	if(gl)
	{
		sin[0][0].sin_addr.s_addr=inet_addr(argv[2]);
		sin[0][0].sin_family=AF_INET;
		sin[0][0].sin_port=htons(8000);

		sin[0][1].sin_addr.s_addr=htonl(INADDR_ANY);       
		sin[0][1].sin_family=AF_INET;
		sin[0][1].sin_port=htons(atoi(argv[3]));

	    sin[0][2]=sal;                                    

		memset(&sin[0][3],0,addrlen);            
		sin[0][3].sin_family=AF_INET;
	}
	else
	{
        memset(&sin[0][0],0,addrlen);
		sin[0][0].sin_family=AF_INET;
		sin[0][0].sin_addr.s_addr=inet_addr("127.0.0.1");

		sin[0][1].sin_addr.s_addr=htonl(INADDR_ANY);
		sin[0][1].sin_family=AF_INET;
		sin[0][1].sin_port=htons(atoi(argv[3]));

		sin[0][2]=sal;                                   

		sin[0][3].sin_addr.s_addr=inet_addr(argv[2]);
		sin[0][3].sin_family=AF_INET;
	}
   	sin[1][0]=sin[0][3];       
   	sin[1][1]=sin[0][2];  
   	sin[1][2]=sin[0][1];   
   	sin[1][3]=sin[0][0];       

    if((sock[0][0]=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
	{
		cout<<"Socket sock[0][0] Error: "<<GetLastError()<<endl;
		return -1;
	}
	if(bind(sock[0][0],(struct sockaddr *)&sin[0][1],addrlen)==SOCKET_ERROR)
	{
		cout<<"Bind sock[0][0] Error: "<<GetLastError()<<endl;
		return -1;
	}
    sock[1][1]=sock[0][0];

	cout<<"\n正常工作中..."<<endl;

	hthreads[0]=CreateThread(NULL,0,u2i,(LPVOID)0,NULL,&hthreadid[0]);
	hthreads[1]=CreateThread(NULL,0,i2u,(LPVOID)1,NULL,&hthreadid[1]);

	while(1)
	{
	dwret=WaitForMultipleObjects(2,hthreads,false,INFINITE);        
	if(dwret==WAIT_FAILED)
	{
		cout<<"WaitForMultipleObjects Error: "<<GetLastError()<<endl;
		return -1;
	}
	log=dwret-WAIT_OBJECT_0;
	if(log==0)
	{
		CloseHandle(hthreads[0]);
    	closesocket(sock[0][1]);
    	hthreads[0]=CreateThread(NULL,0,u2i,(LPVOID)0,NULL,&hthreadid[0]);
	}
	else if(log==1)
	{
		CloseHandle(hthreads[1]);
    	closesocket(sock[1][0]);
    	hthreads[1]=CreateThread(NULL,0,i2u,(LPVOID)1,NULL,&hthreadid[1]);
}
	else
	{
    	for(int no1=0;no1<2;no1++)
		{
			CloseHandle(hthreads[no1]);
			for(int no2=0;no2<2;no2++)
            	closesocket(sock[no1][no2]);
		}
	}
	}
	WSACleanup();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -