16,471
社区成员
发帖
与我相关
我的任务
分享
// GetPubIPDlg.cpp : implementation file
#pragma comment(lib,"ws2_32.lib")
#include <afxinet.h> //加入CIneternetSession的引用
//写文本文件
BOOL wFile(CString filePath,CString fileContent)
{
CFile file;
file.Open(filePath,CFile::modeCreate|CFile::modeWrite);
file.Write(fileContent,fileContent.GetLength());
file.Close();
return TRUE;
}
//测试模拟发包
void CGetPubIPDlg::testSendData(char *sData,CString strFilePath)
{
SOCKADDR_IN saServer;
LPHOSTENT lphostent;
WSADATA wsadata;
SOCKET hsocket;
int nRet;
char* host_name="www.ip138.com";
CString strBottomLine;
CString strReplyContet;
//要写入文本文件的内容
CString logContent;
// 初始化套接字
if(WSAStartup(MAKEWORD(2,2),&wsadata))
{
AfxMessageBox("初始化SOCKET出错");
return;
}
lphostent=gethostbyname(host_name);
if(lphostent==NULL)
{
AfxMessageBox("本地电脑没有IP");
return;
}
hsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
saServer.sin_family = AF_INET;
saServer.sin_port = htons(80); //默认端口
saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list); //***本地IP地址***
// 利用SOCKET连接
nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));
if(nRet == SOCKET_ERROR)
{
AfxMessageBox("建立连接时出错");
closesocket(hsocket);
return ;
}
//发送的数据包写文本文件
logContent.Insert(logContent.GetLength(),"发送的数据包:\r\n");
logContent.Insert(logContent.GetLength(),sData);
wFile(strFilePath,logContent);
//利用SOCKET发送 ******
nRet = send(hsocket,sData,strlen(sData),0);
if(nRet==SOCKET_ERROR)
{
AfxMessageBox("发送数据包时出错");
closesocket(hsocket);
}
Sleep(100);
char Dest[3000];
nRet=1;
CString strMsg;
// 接收返回数据包
nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);
Dest[nRet] =0;
CString strPubIP; //公网IP地址
strMsg.Format("%s",Dest);
//收到的Socket数据包写文本文件
logContent.Insert(logContent.GetLength(),"收到的Socket数据包:\r\n");
logContent.Insert(logContent.GetLength(),strMsg);
wFile(strFilePath,logContent);
CString strIPHead = ":[";
CString strIPTail ="] ";
//解析公网IP地址
strMsg = strMsg.Right(strMsg.GetLength()-strMsg.Find(strIPHead)-3);
strPubIP = strMsg.Left(strMsg.GetLength()-strMsg.Find(strIPTail)-14);
strPubIP = "公网IP: "+strPubIP;
AfxMessageBox(strPubIP);
}
//方法一
void CGetPubIPDlg::OnButton1()
{
//请求的数据包
char* req1= "GET /ip2city.asp HTTP/1.1\r\n"
"Accept: */*\r\n"
"Accept-Language: zh-cn\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n"
"Host: www.ip138.com\r\n"
"Connection: Keep-Alive\r\n\r\n";
testSendData(req1,"收发的数据包-01.txt");
}
//方法二
void CGetPubIPDlg::OnButton2()
{
//请求的数据包
char* req2= "GET /ip2city.asp HTTP/1.1\r\n"
"Accept: */*\r\n"
"Accept-Language: zh-cn\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n"
"Host: www.ip138.com\r\n"
"Connection: Close\r\n\r\n";
testSendData(req2,"收发的数据包-02.txt");
}
//方法三
void CGetPubIPDlg::OnButton3()
{
//请求的数据包
char* req3= "GET /ip2city.asp HTTP/1.1\r\n"
"Accept: */*\r\n"
"Accept-Language: zh-cn\r\n"
//"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n"
"Host: www.ip138.com\r\n"
"Connection: Keep-Alive\r\n\r\n";
testSendData(req3,"收发的数据包-03.txt");
}
//方法四
void CGetPubIPDlg::OnButton4()
{
//请求的数据包
char* req4= "GET /ip2city.asp HTTP/1.1\r\n"
"Accept: */*\r\n"
"Accept-Language: zh-cn\r\n"
//"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n"
"Host: www.ip138.com\r\n"
"Connection: Close\r\n\r\n";
testSendData(req4,"收发的数据包-04.txt");
}
//方法五 获取远程页面的源文件
void CGetPubIPDlg::OnButton5()
{
CString m_SiteName ="http://www.ip138.com/ip2city.asp";
CString m_SiteInfo ="";
CInternetSession mySession(NULL,0);
CHttpFile* myHttpFile=NULL;
m_SiteInfo="连接到站点"+m_SiteName+"\r\n";
UpdateData(false);
CString myData;
myHttpFile=(CHttpFile*)mySession.OpenURL(m_SiteName);
while(myHttpFile->ReadString(myData))
{
m_SiteInfo=m_SiteInfo+"\r\n";
m_SiteInfo+=myData;
}
myHttpFile->Close ;
mySession.Close ;
//远程文件的源代码写文本文件
wFile("远程页面源文件.txt",m_SiteInfo);
//从源代码中解析出公网IP地址
CString strIPHead = ":[";
CString strIPTail ="] ";
//截取公网IP地址
CString strPubIP;
m_SiteInfo = m_SiteInfo.Right(m_SiteInfo.GetLength()-m_SiteInfo.Find(strIPHead)-3);
strPubIP = m_SiteInfo.Left(m_SiteInfo.GetLength()-m_SiteInfo.Find(strIPTail)-14);
//拼接公网IP和内网IP
strPubIP = "您的公网IP是:\r\n"+strPubIP;
AfxMessageBox(strPubIP);
}
模拟发包:
GET /ip2city.asp HTTP/1.1
Host: www.ip138.com
Connection:Close
代理上网也能用这个来获取IP么?
tracert www.ip138.com
typedef struct
{
BYTE Ver;
BYTE nMethods;
BYTE Methods[2];
}REQ1_SOCK5,*LPREQ1_SOCK5;
typedef struct
{
BYTE Ver;
BYTE Method;
}ANS1_SOCK5,*LPANS1_SOCK5;
typedef struct
{
BYTE Ver;
BYTE Status;
}ANS_AUTHEN_SOCK5,*LPANS_AUTHEN_SOCK5;
typedef struct
{
BYTE Ver;
BYTE Cmd;
BYTE Rsv;
BYTE Atyp;
BYTE other;
}REQ2_SOCK5,*LPREQ2_SOCK5;
typedef struct
{
BYTE Ver;
BYTE Rep;
BYTE nMethods;
BYTE Methods[2];
}ANS2_SOCK5,*LPANS2_SOCK5;
//通过Socks5代理连接服务器
int ConnectServerBySocks5Proxy(
LPCTSTR lpszServerAddr,
DWORD nServerPort,
LPCTSTR lpszProxyAddr,
DWORD nProxyPort,
LPCTSTR lpszProxyAccount,
LPCTSTR lpszProxyPwd
)
{
char buf[1024+1]={0};
int iProxyAccountLen,iProxyPwdLen;
int cbRecv = 0;
int cbSend = 0;
struct hostent* he = NULL;
struct sockaddr_in svrAddr;
SOCKET sock = 0;
LPREQ1_SOCK5 m_proxyreq1;
LPREQ2_SOCK5 m_proxyreq2;
LPANS1_SOCK5 m_proxyans1;
LPANS2_SOCK5 m_proxyans2;
LPANS_AUTHEN_SOCK5 m_authans;
if( !lpszServerAddr || !lpszProxyAddr || !lpszProxyAccount || !lpszProxyPwd ){
return -1;
}
iProxyAccountLen = strlen( lpszProxyAccount );
iProxyPwdLen = strlen( lpszProxyPwd );
//参数检查
if ( iProxyAccountLen > 255 || iProxyPwdLen > 255 )
return -2;//非法的帐号或密码
if ((he=gethostbyname(lpszProxyAddr)) == NULL) { // get the host info
return -3;//获取远程主机信息失败,原因:IP解析失败或无效的IP,或网络不通
}
svrAddr.sin_family = AF_INET; // host byte order
svrAddr.sin_port = htons( (u_short)nProxyPort ); // short, network byte order
svrAddr.sin_addr = *((struct in_addr *)he->h_addr);
ZeroMemory( svrAddr.sin_zero, sizeof(svrAddr.sin_zero) ); // zero the rest of the struct
sock = socket(AF_INET, SOCK_STREAM, 0);
if( INVALID_SOCKET == sock ){
return -4;
}
if ( SOCKET_ERROR == connect(sock,(struct sockaddr*)&svrAddr, sizeof(svrAddr)) ){
closesocket( sock );
return -5;//连接代理服务器失败
}
m_proxyreq1 = (LPREQ1_SOCK5)buf;
m_proxyreq1->Ver = 5;
m_proxyreq1->nMethods = 2;
m_proxyreq1->Methods[0] = 0x0;
m_proxyreq1->Methods[1] = 0x2;
if( send(sock, buf, sizeof(REQ1_SOCK5), 0 ) < 1 ){
closesocket( sock );
return -102;//第一次请求代理服务器交互出错
}
m_proxyans1 = (LPANS1_SOCK5)buf;
ZeroMemory( m_proxyans1, sizeof(ANS1_SOCK5) );
if ( WaitSomeTime(sock, 60, RECV) == 1){
cbRecv = recv(sock, buf, sizeof(ANS1_SOCK5) ,0 );
}else{
closesocket( sock );
return -103; //接收代理服务器第一次响应出错
}
if (cbRecv<1) {
closesocket( sock );
return -104;
}
if(m_proxyans1->Ver != 0x5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2)){
closesocket( sock );
return -6; //代理服务器不支持socket5
}
if(m_proxyans1->Method == 0x2){
cbSend = 0;
buf[cbSend++] = 0x1;
buf[cbSend++]= (char)iProxyAccountLen;
memcpy( buf+cbSend, lpszProxyAccount, iProxyAccountLen );
cbSend += iProxyAccountLen;
buf[cbSend++]= (char)iProxyPwdLen;
memcpy( buf+cbSend, lpszProxyPwd, iProxyPwdLen );
cbSend += iProxyPwdLen;
if ( send(sock, buf, cbSend , 0) < 1){
closesocket( sock );
return -110;//验证请求代理服务器交互出错
}
m_authans = (LPANS_AUTHEN_SOCK5)buf;
ZeroMemory( m_authans, sizeof(ANS_AUTHEN_SOCK5) );
if (WaitSomeTime(sock, 60, RECV) == 1)
cbRecv = recv(sock, buf, 100,0);
else{
closesocket( sock );
return -111; ///验证请求代理服务器交互出错
}
if( m_authans->Ver != 1 || m_authans->Status != 0)
{
closesocket( sock );
return -112; //代理服务器用户验证失败
}
}
// VER:1字节,协议版本号码,这里是 X'05'。
// CMD:1字节,SOCKS命令字,其意义如下。
// 连结请求(CONNECT),值为:X'01'
// 绑定请求(BIND),值为:X'02'
// UDP关联请求(UDP ASSOCIATE),值为:X'03'
// RSV:1字节,保留备用。
// ATYP:1字节,所用的地址类型,如下。
// IPV4地址(IPV4): X'01'
// 域名(DOMAINNAME): X'03'
// IPV6地址(IPV6): X'04'
// DST.ADDR:长度可变,客户机期望连结的目的主机地址。
// DST.PORT:2字节,客户机期望的目的主机应用的端口(网络字节序)
m_proxyreq2 = (LPREQ2_SOCK5)buf;
m_proxyreq2->Ver = 0x5;
m_proxyreq2->Cmd = 0x1;
m_proxyreq2->Rsv = 0x0;
m_proxyreq2->Atyp = 0x3;//域名
cbSend = 4;
int iAddrLen = strlen( lpszServerAddr )%256;
buf[cbSend++] = (char)iAddrLen;
memcpy( buf + cbSend, lpszServerAddr, iAddrLen );
cbSend += iAddrLen;
buf[cbSend++] = (char)( nServerPort>>8 );
buf[cbSend++] = (char)( nServerPort%255 );
if ( send( sock, buf, cbSend, 0 ) < 1 ){
closesocket( sock );
return -113;//验证请求代理服务器交互出错
}
m_proxyans2 = (LPANS2_SOCK5)buf;
ZeroMemory( buf, sizeof(ANS2_SOCK5) );
if (WaitSomeTime(sock, 60, RECV) == 1)
cbRecv = recv(sock, buf, 100,0);
else{
closesocket( sock );
return -114; ///验证请求代理服务器交互出错
}
if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0){
closesocket( sock );
return -115;//通过代理连接主站不成功!
}
return sock;
}