📄 onetouchdlg.cpp
字号:
}
}
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 + -