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

📄 proxydlg.cpp

📁 实现网络的远程接入代理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			fprintf(daylogfd,"(%s)%s\n",m_strCurrentTime,strData);
			fflush(daylogfd);
		}

		return ;
	}
}

void CProxyDlg::Tcp_Accept(UINT wParam, LONG lParam)
{
/*	int				i, cli_len;
	SOCKET			newsocketfd;
	SOCKADDR_IN		cli_addr;

	for(i=0;i<ServerLst.ServerTotal;i++)
	{
		if(ServerLst.TcpServerMember[i].Socketfd==(int)wParam)
			break;
	}

	if(i==ServerLst.ServerTotal)
		return;

	switch(WSAGETSELECTEVENT(lParam))
	{
		case FD_ACCEPT:

			cli_len=sizeof(cli_addr);
			if((newsocketfd=accept(ServerLst.TcpServerMember[i].Socketfd,(SOCKADDR *)&cli_addr,&cli_len))==SOCKET_ERROR)
			{
			}else
			{
				sprintf(DataStr,"Description : %s connect to me",inet_ntoa(cli_addr.sin_addr));
				SaveInformation(DataStr);
			}

			break;

		default:
			if(WSAGETSELECTERROR(lParam)!=0)
				closesocket(ServerLst.TcpServerMember[i].Socketfd);
			break;
	}

	return;*/
}

BOOL CProxyDlg::ConnectToServer(int ServerLstIndex, int TcpLstIndex)
{
	SOCKET 				sd;
	struct sockaddr_in 	sin;
	int					i=0;
	CString				strMsg;
	CSock5              SendData;

	if((sd=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
	{
		return FALSE;
	}
			
	strcpy(ProxyAddr,"202.118.227.60");
	sin.sin_family=AF_INET;
	sin.sin_port = htons(1080);//htons(TcpLst.TcpMember[TcpLstIndex].ServerPort);
	sin.sin_addr.s_addr=inet_addr(ProxyAddr);//inet_addr(TcpLst.TcpMember[TcpLstIndex].ServerIpAddr);
	if(connect(sd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		sprintf(DataStr,"Connect to %s fail",TcpLst.TcpMember[TcpLstIndex].ServerIpAddr);
		SaveInformation(DataStr);
		
		return FALSE;
	}else
	{
		TcpLst.TcpMember[TcpLstIndex].ServerSocketfd=sd;
		if(WSAAsyncSelect(TcpLst.TcpMember[TcpLstIndex].ServerSocketfd, m_hWnd, UM_RECV, FD_READ|FD_CLOSE)==SOCKET_ERROR)
		{
			closesocket(TcpLst.TcpMember[TcpLstIndex].ServerSocketfd);
			TcpLst.TcpMember[TcpLstIndex].ServerSocketfd=-1;

			return FALSE;
		}else
		{
			
			sprintf(DataStr,"Connect to %s succeed!",ProxyAddr);
			SaveInformation(DataStr);

			SendData.userdata.negotiation.Version=0x05;
			SendData.userdata.negotiation.MethodCount=0X01;
			SendData.userdata.negotiation.Method[0]=0x00;

			if(send(sd,SendData.userdata.data,3,0)==SOCKET_ERROR)
			{
				return FALSE;
			}
//			commsend(SendData,3);

/*			SendData.userdata.connect.Version=0x05;
			SendData.userdata.connect.Command=0x01;
			SendData.userdata.connect.RSV=0x00;
			SendData.userdata.connect.AType=0x01;
			SendData.userdata.connect.Addr=inet_addr(TcpLst.TcpMember[0].ServerIpAddr);
			SendData.userdata.connect.Port=htons(TcpLst.TcpMember[0].ServerPort);

			commsend(SendData,sizeof(tagSock5connect));*/

			return TRUE;
		}
	}
}

void CProxyDlg::GetCurrentTimeStr()
{
	CTime	current=CTime::GetCurrentTime();
	m_strCurrentTime.Format("%04d-%02d-%02d %02d:%02d:%02d",current.GetYear(),current.GetMonth(),current.GetDay(),current.GetHour(),current.GetMinute(),current.GetSecond());
	m_strTime.Format("%02d:%02d:%02d",current.GetHour(),current.GetMinute(),current.GetSecond());
}

BOOL CProxyDlg::Tcp_Write(int TcpLstIndex, BOOL ClientToServer,char *DataStr, int Len)
{
	char strTemp[20];
	if(send(TcpLst.TcpMember[TcpLstIndex].ServerSocketfd,DataStr,Len,0)==SOCKET_ERROR)
	{
		return FALSE;
	}

	if (bWriteLog)
	{
		strcpy(strTemp,TcpLst.TcpMember[TcpLstIndex].ServerIpAddr);
		GetCurrentTimeStr();
		fprintf(daylogfd,"[%s]Send   to  %s : ",
			m_strTime,strTemp);
		
		for(int i=0;i<Len;i++)
		{
			fprintf(daylogfd,"%02x ",(unchar)DataStr[i]);		
		}
	
		fprintf(daylogfd,"\n");
		fflush(daylogfd);
	}
		
	return TRUE;
}

BOOL CProxyDlg::DestroyWindow() 
{
	Variable_Release();	
	return CDialog::DestroyWindow();
}

int CProxyDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	//右键弹出菜单为IDR_TRAYPOPUP
	//托盘图标为m_hTrayIcon
	//通知消息为WM_TRAYNOTIFY
	if(!m_TrayIcon.Create(this,IDR_MENU_POP,_T("代理工具"),m_hTrayIcon,WM_TRAYNOTIFY))
	{
		AfxMessageBox(_T("Failed to create tray icon"),MB_OK|MB_ICONSTOP);
		return -1;
	}	
	return 0;
}

LRESULT CProxyDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
	//返回类CTrayNotifyIcon消息响应函数
	return m_TrayIcon.OnTrayNotification(wParam,lParam);

}

void CProxyDlg::OnHide() 
{
	ShowWindow(SW_SHOWMINIMIZED);
	ShowWindow(SW_HIDE);
	UpdateWindow();
	m_TrayIcon.m_bIsWindowNormal = false;
}

void CProxyDlg::OnShow() 
{
	ShowWindow(SW_SHOWNOACTIVATE);
	SetForegroundWindow();
	m_TrayIcon.m_bIsWindowNormal = true;	
}

void CProxyDlg::OnUpdateShow(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(!m_TrayIcon.m_bIsWindowNormal);
}

void CProxyDlg::OnUpdateHide(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_TrayIcon.m_bIsWindowNormal);	
}

void CProxyDlg::OnExit() 
{
	DestroyWindow();			
}

void CProxyDlg::OnButtonDisable() 
{
	CPktB SendData;

	SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr);
	SendData.sid=htonl(MyIp);
	SendData.centerid=htons(0x2900);
	SendData.type=htons(0x8203);
	SendData.version=0x30;
	commsend(SendData,13);
}

void CProxyDlg::OnButtonEnable() 
{
	CPktB SendData;

	SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr);
	SendData.sid=htonl(MyIp);
	SendData.centerid=htons(0x2900);
	SendData.type=htons(0x8202);
	SendData.version=0x30;
	commsend(SendData,13);
	
}

void CProxyDlg::OnButtonQuery() 
{
	CPktB SendData;

	SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr);
	SendData.sid=htonl(MyIp);
	SendData.centerid=htons(0x2900);
	SendData.type=htons(0x8200);
	SendData.version=0x30;
	commsend(SendData,13);
	
}

void CProxyDlg::OnOK() 
{
	if (ConnectToServer(0,0))
		m_Connect.EnableWindow(FALSE);		
}

void CProxyDlg::DoEvent(char buf[], int buflen)
{
	CPktB    RecvData;
	CVehicleType VehicleType;
	char     sTemp[20];
	static int      Count=0;
	CSock5   Sock5Data;

	if (buflen<2)
		return;
	if ((buf[0]==0x7e)&&(buf[buflen-1]==0x7e))
	{
		memcpy((void *)&RecvData,buf+1,buflen-3);
		switch (htons(RecvData.type))
		{
			case 0x8240:
				if (RecvData.userdata.Nm_8240pkt1.type==1)
				{
					for (int i=0;i<RecvData.userdata.Nm_8240pkt1.Count;i++)
					{
						VehicleType=RecvData.userdata.Nm_8240pkt1.VehicleType[i];
						VehicleType.Count=htons(VehicleType.Count);
						sprintf(sTemp,"0x%x",VehicleType.CenterId&0x00ff|0x2900);
						m_List.InsertItem(0,sTemp,0);
						ReConvertStr(VehicleType.VehicleType,sTemp,10);
						m_List.SetItemText(0,1,sTemp);
						sprintf(sTemp,"%d",VehicleType.Count);
						m_List.SetItemText(0,2,sTemp);
						if ((VehicleType.CenterId&0x2900)!=0x2900)
						{
							Count+=VehicleType.Count;
						}
					}
					sprintf(sTemp,"%d",Count);
					m_Count.SetWindowText(sTemp);

					if (RecvData.userdata.Nm_8240pkt1.Count<16)
						Count=0;
				}
				else
					AfxMessageBox("Fail");
				break;
			case 0x8242:
				AfxMessageBox("允许成功");
				break;
			case 0x8243:
				AfxMessageBox("禁止成功");
				break;
			case 0x8244:
				switch (RecvData.userdata.data[0])
				{
					case 0x01:
						m_Status.SetWindowText("允许");
						break;
					case 0x00:
						m_Status.SetWindowText("禁止");
						break;
					default:
						m_Status.SetWindowText("未知");
						break;
				}
				break;
			default:
				break;
		}
	}
	else
	{
		memcpy(Sock5Data.userdata.data,buf,buflen);
		if (buflen==2)
		{
			if (Sock5Data.userdata.negotiationack.Method!=0xff)
			{
				Sock5Data.userdata.connect.Version=0x05;
				Sock5Data.userdata.connect.Command=0x01;
				Sock5Data.userdata.connect.RSV=0x00;
				Sock5Data.userdata.connect.AType=0x01;
				Sock5Data.userdata.connect.Addr=inet_addr(TcpLst.TcpMember[0].ServerIpAddr);
				Sock5Data.userdata.connect.Port=htons(TcpLst.TcpMember[0].ServerPort);

				commsend(Sock5Data,sizeof(tagSock5connect));
			}
			else
				m_Connect.EnableWindow(FALSE);
		}
		else
		{
			if (Sock5Data.userdata.connectack.Rep!=0x00)
			{
				m_Connect.EnableWindow(FALSE);
			}
		}
	}
}

void CProxyDlg::ConvertIp()
{
	char strHostName[100];
	char Ip[20];

	gethostname(strHostName,100);
	struct hostent *pHostent=gethostbyname(strHostName);

	strcpy(Ip,inet_ntoa(*(struct in_addr *)*pHostent->h_addr_list));

	MyIp=inet_addr(Ip);
}

void CProxyDlg::commsend(CPktB SendData, int iLen)
{
	if (TcpLst.TcpMember[0].ServerSocketfd==-1)
		AfxMessageBox("请先连接服务器");
	else
	{
		int Len;
		char TempOld[MAX_LEN],TempNew[MAX_LEN];
		memcpy(TempOld,(char*)&SendData,iLen);
		Len=AddFsynToBuf(TempOld,TempNew,iLen);
		Tcp_Write(0,TRUE,TempNew,Len);
	}
}

int CProxyDlg::AddFsynToBuf(char OldBuf[], char NewBuf[], int Len)
{
	int		Len_Temp=1,i;
	char	OldBuf_Temp[MAX_LEN+2];
	unsigned short	CheckSum=Get_CheckSum(OldBuf,Len);
	
	memcpy((void *)OldBuf_Temp,(void *)OldBuf,Len);

	CheckSum=htons(CheckSum);
	memcpy((void *)(OldBuf_Temp+Len),(void *)&CheckSum,2);

	for(i=0;i<Len+2;i++)
	{
		switch(OldBuf_Temp[i])
		{
			case 0x7e:
				NewBuf[Len_Temp++]=0x7d;
				NewBuf[Len_Temp++]=0x02;
				break;
			case 0x7d:
				NewBuf[Len_Temp++]=0x7d;
				NewBuf[Len_Temp++]=0x01;
				break;
			default:
				NewBuf[Len_Temp++]=OldBuf_Temp[i];
				break;
		}//end switch(OldBuf[i])
	}//end for
	
	NewBuf[0]=0x7e;
	NewBuf[Len_Temp++]=0x7e;
	
	return Len_Temp;
}

unshort CProxyDlg::Get_CheckSum(char buf[], int len)
{
	unsigned short	CheckSum=0;

	for(int i=0;i<len;i++)
	{
		CheckSum += (unsigned char )buf[i];
		if(CheckSum < (unsigned char)buf[i])
			CheckSum += 1;
	}
	CheckSum=~CheckSum;
	CheckSum += 1;

	return CheckSum;
}

void CProxyDlg::ReConvertStr(char buf[], char newbuf[], int len)
{
	int		i;

	memcpy((void *)newbuf,(void *)buf,len);
	for(i=len-1;i>=0;i--)
	{
		if(newbuf[i]!=0x20)
			break;
	}
	if(i>=0)
		newbuf[i+1]=0;
	else
		newbuf[0]=0;
}

void CProxyDlg::SendStatusQuery()
{
	if (TcpLst.TcpMember[0].ServerSocketfd!=-1)
	{
		CPktB SendData;

		SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr);
		SendData.sid=htonl(MyIp);
		SendData.centerid=htons(0x2900);
		SendData.type=htons(0x8204);
		SendData.version=0x30;
		commsend(SendData,13);

		SendData.type=htons(0x1101);
		commsend(SendData,13);
	}
}

void CProxyDlg::commsend(CSock5 SendData, int iLen)
{
	Tcp_Write(0,TRUE,(char*)&SendData,iLen);
}

⌨️ 快捷键说明

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