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

📄 onetouchdlg.cpp

📁 可以一键自动检测局域网内的网关和未被占用的IP地址
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}	
}

void COnetouchDlg::OnButton1()					//测试代理服务器
{
	UpdateData(true);
	if(testServerInUse)
	{
		m_info = "已经在测试中了,表急:)";
		UpdateData(false);	
		return;
	}
	testServerInUse = true;
	m_info = "正在测试代理中,请稍候...(期间可以进行其它操作)";
	UpdateData(false);
//	CString ProxyHostName = IPaddress2CString();
	testProxyServer = m_addr;
	testProxyServer.TrimLeft();
	testProxyPort = atoi(m_port);//转换CString
//	bool flag = getHttpRet(testProxyServer, port, retMsg);
	AfxBeginThread(getHttpRet, this);
	
}

//bool COnetouchDlg::getHttpRet(CString testProxyServer, unsigned short testProxyPort, char* httpRetId)
UINT COnetouchDlg::getHttpRet( LPVOID pParam )
{											//VC++ Winsock 实现与 HTTP 服务器通话
	COnetouchDlg* p = (COnetouchDlg*)pParam;//p访问OnetouchDlg的变量	
	SOCKADDR_IN   Server;
	LPHOSTENT   lphostent;
	WSADATA   wsadata;
	int   nRet;
	SOCKET s;
	char dest[100];
	CString req;
	if(p->m_checkPA == 1)
	{//需要验证
		CString credentials = p->m_userid + ":" + p->m_pwd;
		const char* a = (const char*)credentials;//注意:这里CString可以转化成const char*(char *不可以),
		//const char* 可以转化成 const unsigned char*, 但是CString 不可以直接转化成const unsigned char*  !!!
		Base64Encode(dest, (const unsigned char*)a, strlen(credentials));
		//base64编码(将用户名和密码编码!!!)
		req = "GET ";
		req += testUrl;
		req += " HTTP/1.1\r\nHost: \r\nProxy-Authorization: Basic ";	//此处GET全要大写(昏 半天没调试成功!!!)
		req += dest;  //此处+运算连接的字符串并不包括dest[100]中未使用的部分(dest包含了0结尾)
		//Proxy-Authorization: Basic [base64的编码,格式"用户名:密码"] , 验证代理.
		req += "\r\n\r\n";
	}
	else
		req = "GET ";
		req += testUrl;
		req += " HTTP/1.1\r\nHost: \r\n\r\n";
	if(WSAStartup(winsock_version,&wsadata))
	{
//		AfxMessageBox("can't   initial   socket");
		AfxMessageBox("无法连接代理服务器!(can't   initial   socket)");
		p->m_info = "无法连接代理服务器!(can't   initial   socket)";
		m_MWnd->SendMessage(WM_UPDATEDATA, FALSE);
		testServerInUse = false;
		return 0;
	}
	lphostent = gethostbyname(testProxyServer); //要测试的代理域名转化成ip
    if(lphostent==NULL)
	{//解析失败
//		AfxMessageBox("域名解析失败!");
		AfxMessageBox("无法连接代理服务器!(域名解析失败)");
		p->m_info = "无法连接代理服务器!(域名解析失败)";
		m_MWnd->SendMessage(WM_UPDATEDATA, FALSE);
		testServerInUse = false;
		return 0;
	}
	s = socket(AF_INET,   SOCK_STREAM,   IPPROTO_TCP);
	Server.sin_family   =   AF_INET;
	Server.sin_port   =   htons(testProxyPort); 
	Server.sin_addr   =   *((LPIN_ADDR)*lphostent->h_addr_list);
	nRet   =   connect(s,   (LPSOCKADDR)&Server,  sizeof(SOCKADDR_IN));
	if   (nRet   ==   SOCKET_ERROR)
	{
//		AfxMessageBox("不能连接服务器!");
		closesocket(s);//关闭socket
		AfxMessageBox("无法连接代理服务器!(连接错误,请检查网络并确定服务器可用)");
		p->m_info = "无法连接代理服务器!(连接错误,请检查网络并确定服务器可用)";
		m_MWnd->SendMessage(WM_UPDATEDATA, FALSE);
		testServerInUse = false;
		return 0;
	}
//	else
//		AfxMessageBox((CString)"connected   with  "+(CString)"www.baidu.com");
	nRet   =   send(s,   req,   strlen(req),   0); //向服务器发送数据
	if   (nRet   ==   SOCKET_ERROR)
	{
//		AfxMessageBox("与服务器通信失败!");
		closesocket(s);
		AfxMessageBox("无法连接代理服务器!(发送错误,请检查网络并确定服务器可用)");
		p->m_info = "无法连接代理服务器!(发送错误,请检查网络并确定服务器可用)";
		m_MWnd->SendMessage(WM_UPDATEDATA, FALSE);
		testServerInUse = false;
		return 0;
	}
//	else
//		AfxMessageBox("send   OK");
	char recvStr[12];
	char httpRetId[4]={0};
	nRet=1;
	if(nRet>0)
		nRet=recv(s,(LPSTR)recvStr,sizeof(recvStr),0);
	httpRetId[0] = recvStr[9];
	httpRetId[1] = recvStr[10];
	httpRetId[2] = recvStr[11];
	CString ret = (char*)httpRetId;	

	if(ret == "200")
	{
		AfxMessageBox("代理服务器工作正常!");
		p->m_info = "代理服务器工作正常!";
	}
	else if(ret == "407" || ret == "401")
	{
		AfxMessageBox("不能通过代理服务器验证!");
		p->m_info = "不能通过代理服务器验证!";
	}
	else
	{
		AfxMessageBox("无法连接代理服务器!(服务器拒绝)");
		p->m_info = "无法连接代理服务器!(错误号:" + ret + ")";		
	}
	m_MWnd->SendMessage(WM_UPDATEDATA, FALSE);
	testServerInUse = false;
	return 0;	

/*	char   recvStr[1000];   //接受服务器返回的数据
	while(nRet>0)
	{
		nRet=recv(s,(LPSTR)recvStr,sizeof(recvStr),0);
		if(nRet>0)
			recvStr[nRet]=0;
		else
			recvStr[0]=0;
	} */
}


void COnetouchDlg::OnSelchangeCombo1() 
{
	UpdateData(true);
	m_checkPE = 1;
	m_addrCtr.EnableWindow(true);
	m_portCtr.EnableWindow(true);
	if(m_combo == 0)
	{
		m_addr = "jproxy.nju.edu.cn";
		m_port = "8080";
		m_checkPA = 1;
		m_useridCtr.EnableWindow(true);
		m_pwdCtr.EnableWindow(true);
		m_userid = "";
		m_pwd = "";
	//	m_userid = "likb";
	//	m_pwd = "likb8646400";
	}
	else if(m_combo == 1)
	{
		m_addr = "sproxy.nju.edu.cn";
		m_port = "8080";
		m_checkPA = 1;
		m_useridCtr.EnableWindow(true);
		m_pwdCtr.EnableWindow(true);
		m_userid = "";
		m_pwd = "";
	}
	else if(m_combo == 2)
	{
		m_addr = "proxy.nju.edu.cn";
		m_port = "8080";
		m_checkPA = 1;
		m_useridCtr.EnableWindow(true);
		m_pwdCtr.EnableWindow(true);
		m_userid = "";
		m_pwd = "";
	}
	else if(m_combo == 3)
	{
		Refresh();
	}	
	
	UpdateData(false);
}

void COnetouchDlg::OnChangeEdit2() 
{
	UpdateData(true);
	m_combo = -1;
	UpdateData(false);	
}

void COnetouchDlg::OnChangeEdit1() 
{
	UpdateData(true);
	m_combo = -1;
	UpdateData(false);
}

void COnetouchDlg::Refresh()
{
	readReg(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
	readRegValue2Box();
} 

//////////////////////////////////////////////////////
//////其他处理函数
LPBYTE CString_To_LPBYTE(CString str)
{//CString类型转化成LPBYTE类型
	LPBYTE lpb=new BYTE[str.GetLength()+1]; 
	for(int i=0;i<str.GetLength();i++)
		lpb[i] = str[i];
	lpb[str.GetLength()]=0;
	return lpb;
}

CString COnetouchDlg::IPaddress2CString(CIPAddressCtrl& m_IP)
{
	BYTE f[4];
	m_IP.GetAddress(f[0],f[1],f[2],f[3]);    //CString s 成员变量,ip转为字符串
	CString temp;
	CString s;
	for(int i=0;i<4;i++)
	{
		temp.Format("%u",f[i]);
		s+=temp;
		if(i!=3)
			s+=".";
	}
	if(s=="0.0.0.0")
		return "";
	return s;
}

void EmitErrorMsg (long hr, char* szMsg) {//显示系统错误号的详细信息	
//	char szMsg[1024];
	FormatMessage( 
      FORMAT_MESSAGE_FROM_SYSTEM, 
      NULL,
      hr,
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
      szMsg,
      1024,
      NULL 
      );	
//	AfxMessageBox(szMsg);
}

CString COnetouchDlg::getHost(char* name) 
{//解析域名(未使用)
	  WORD wVersionRequested;
      WSADATA wsaData;
 //     char name[255]="www.sina.com.cn";
      CString ip;
      PHOSTENT hostinfo;
      wVersionRequested = MAKEWORD( 2, 0 );

      if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
      {
      //      if( gethostname ( name, sizeof(name)) == 0)
       //     {
		//		char name1[255] = "www.sina.com.cn";
                  if((hostinfo = gethostbyname(name)) != NULL)
                  {
                        ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
                  }
       //     }
            
            WSACleanup( );
      } 
//	  AfxMessageBox(ip);
	  return ip;
}

//---------------------------------------------------------------------------
//  Base64 code table
//  0-63 : A-Z(25) a-z(51), 0-9(61), +(62), /(63)
char  Base2Chr( unsigned char n )
{
    n &= 0x3F;
    if ( n < 26 )
        return ( char )( n + 'A' );
    else if ( n < 52 )
        return ( char )( n - 26 + 'a' );
    else if ( n < 62 )
        return ( char )( n - 52 + '0' );
    else if ( n == 62 )
        return '+';
    else
        return '/';
}
//---------------------------------------------------------------------------
unsigned char Chr2Base( char c )
{
    if ( c >= 'A' && c <= 'Z' )
        return ( unsigned char )( c - 'A' );
    else if ( c >= 'a' && c <= 'z' )
        return ( unsigned char )( c - 'a' + 26 );
    else if ( c >= '0' && c <= '9' )
        return ( unsigned char )( c - '0' + 52 );
    else if ( c == '+' )
        return 62;
    else if ( c == '/' )
        return 63;
    else
        return 64;  //  无效字符
}
//---------------------------------------------------------------------------
//  aLen 为 aSrc 的长度, aDest 所指的缓冲区必须至少为 aLen 的 1.33 倍!!!
//  返回 aDest 的长度
int Base64Encode( char * const aDest, const unsigned char * aSrc, int aLen )
{
    char        * p = aDest;
    int           i;
    unsigned char t;

    for ( i = 0; i < aLen; i++ )
    {
        switch ( i % 3 )
        {
        case 0 :
            *p++ = Base2Chr( *aSrc >> 2 );
            t = ( *aSrc++ << 4 ) & 0x3F;
            break;
        case 1 :
            *p++ = Base2Chr( t | ( *aSrc >> 4 ) );
            t = ( *aSrc++ << 2 ) & 0x3F;
            break;
        case 2 :
            *p++ = Base2Chr( t | ( *aSrc >> 6 ) );
            *p++ = Base2Chr( *aSrc++ );
            break;
        }
    }
    if ( aLen % 3 != 0 )
    {
        *p++ = Base2Chr( t );
        if ( aLen % 3 == 1 )
            *p++ = '=';
        *p++ = '=';
    }
    *p = 0;  //  aDest is an ASCIIZ string
    return ( p - aDest );  //  exclude the end of zero
}
//---------------------------------------------------------------------------
//  aDest 所指的缓冲区必须至少为 aSrc 长度的 0.75 倍!!!
//  返回 aDest 的长度
int Base64Decode( unsigned char * const aDest, const char * aSrc )
{
    unsigned char * p = aDest;
    int             i, n = strlen( aSrc );
    unsigned char   c, t;

    for ( i = 0; i < n; i++ )
    {
        if ( *aSrc == '=' )
            break;
        do {
         if ( *aSrc )
        c = Chr2Base( *aSrc++ );
            else
             c = 65;  //  字符串结束
        } while ( c == 64 );  //  跳过无效字符,如回车等
        if ( c == 65 )
         break;
        switch ( i % 4 )
        {
        case 0 :
            t = c << 2;
            break;
        case 1 :
            *p++ = ( unsigned char )( t | ( c >> 4 ) );
            t = ( unsigned char )( c << 4 );
            break;
        case 2 :
            *p++ = ( unsigned char )( t | ( c >> 2 ) );
            t = ( unsigned char )( c << 6 );
            break;
        case 3 :
            *p++ = ( unsigned char )( t | c );
            break;
        }
    }
    return ( p - aDest );
}
//---------------------------------------------------------------------------

////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

void COnetouchDlg::OnButtonauto() 
{
	UpdateData(true);
	if(ipAutoConfig || netshInUse)
	{
		m_info = "已经有一个配置过程正在执行中,请稍候...";
		UpdateData(false);	
		return;
	}
	ipAutoConfig = true;
/*	检测是否有安装winpcap,已经取消这个功能,新版本不需要安装。
	long ret0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\WinPcap", 0, KEY_READ, &hKEY);
	if(ret0 != ERROR_SUCCESS)//不存在就创建并安装开发包
	{
		AfxMessageBox("自动配置IP功能需要WinPcap支持,请先安装。");//询问		
		CString strSetpath = ProgramPath + "\\WinPcap_3_1.exe";
		CFileFind finder;
		BOOL bWorking = finder.FindFile(strSetpath); //非零即存在
		if(!bWorking)
		{
			AfxMessageBox("当前目录没有找到WinPcap开发包,自动配置IP功能将不可使用!");	
			ipAutoConfig = false;
			return;
		}
		strSetpath="cmd /c \""+strSetpath + "\"";		
		char * charSetpath=strSetpath.GetBuffer(strSetpath.GetLength());
		strSetpath.ReleaseBuffer();
//		::AfxMessageBox(charSetpath);
		SECURITY_ATTRIBUTES sa;
		HANDLE hRead,hWrite;
		STARTUPINFO si;
		PROCESS_INFORMATION pi;
		sa.nLength = sizeof(SECURITY_ATTRIBUTES);
		sa.lpSecurityDescriptor = NULL;
		sa.bInheritHandle = TRUE;
		GetStartupInfo(&si);
		si.cb = sizeof(STARTUPINFO);
		si.wShowWindow = SW_HIDE;
		si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
		if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
			AfxMessageBox("Error On CreatePipe()");
			ipAutoConfig = false;			
			return;
		} 
		si.hStdError = hWrite;  
		si.hStdOutput = hWrite;	
		if (!CreateProcess(NULL,charSetpath
			,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
			AfxMessageBox("Error On CreateProcess()");
		}
		CloseHandle(hWrite);		
		ipAutoConfig = false;
		return;				
    }	
	*/
	CString strSetpath = sysDir + "\\drivers\\npf.sys";
	CFileFind finder;
	BOOL bWorking = finder.FindFile(strSetpath); //非零即存在
	if(!bWorking)
	{
		CString driverPath = ProgramPath + "npf.sys";
		bWorking = finder.FindFile(driverPath); 
		if(!bWorking)
		{
			AfxMessageBox("主目录下缺少npf.sys!");
			ipAutoConfig = false;

⌨️ 快捷键说明

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