您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页怎样使用花生壳域名解析出IP

怎样使用花生壳域名解析出IP

来源:华佗小知识
怎样使用花生壳域名解析出IP?----即通常所说的\"上线\" 2010年10月05日 星期二 下午 01:09

本例仅为学习.一个写远控的,连上线都不会.一问三不知,还能算是个网络编程的程序员?上线:就是敲门,1台电脑给另外一台电脑敲门,有人在就进去,没人在就回去.这是最基本的常识.

方法:用的是原始套接字icmp获取的,其实就是一个ping程序(包括IP与网站名的那种ping,仅IP的不可以)

主程序:ping.h与ping.cpp封装好的.直接在你的dlg.cpp程序中调用.其实算不上什么本事,都是抄来的.因为不是搞专业的远控,仅是学习,所以我也没花时间仔细去学这.cpp

顺便介绍下花生壳:从http://www.oray.com/下载花生壳软件,登录后

116.209.15.221就是本机现在的IP.szlmwbcgc.gicp.net就是你账号对应的网站,无论你用的是哪一台机器.(那么端口呢?端口指定的一样的).花生壳其它的就不用管了.你只要做一步即可:打开花生壳软件,登录你的账号即可.难吗?不难,很简单的1步

--------------------------源代码 包括ping.h与ping.cpp,以及外部调用的函数***dlg.cpp-----------------------

-----------------------------------------ping.h--------------------------------------------

// Ping.h: interface for the CPing class. //

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

#if !defined(AFX_PING_H__DD196130_22F6_48DA_BAFC_B799A0034437__INCLUDED_)

#define AFX_PING_H__DD196130_22F6_48DA_BAFC_B799A0034437__INCLUDED_ #if _MSC_VER > 1000 #pragma once

#endif // _MSC_VER > 1000 #include #include #include #include

#define IP_RECORD_ROUTE 0x7 #define DEF_PACKET_SIZE 32

#define MAX_PACKET 1024 // Max ICMP packet size

#define MAX_IP_HDR_SIZE 60 // Max IP header size w/options #define ICMP_ECHO 8 #define ICMP_ECHOREPLY 0

#define ICMP_MIN 8 // Minimum 8-byte ICMP packet (header) class CMyPingDlg;

typedef struct _iphdr {

unsigned int h_len:4; // Length of the header unsigned int version:4; // Version of IP unsigned char tos; // Type of service

unsigned short total_len; // Total length of the packet unsigned short ident; // Unique identifier unsigned short frag_and_flags; // Flags

unsigned char ttl; // Time to live

unsigned char proto; // Protocol (TCP, UDP etc) unsigned short checksum; // IP checksum unsigned int sourceIP; unsigned int destIP; } IpHeader;

typedef struct _icmphdr

{

BYTE i_type;

BYTE i_code; // Type sub code USHORT i_cksum; USHORT i_id; USHORT i_seq;

// This is not the standard header, but we reserve space for time ULONG timestamp; } IcmpHeader;

//

// IP option header - use with socket option IP_OPTIONS //

typedef struct _ipoptionhdr {

unsigned char code; // Option type

unsigned char len; // Length of option hdr unsigned char ptr; // Offset into options unsigned long addr[9]; // List of IP addrs } IpOptionHeader;

class CPing {

public:

void SetConfigure(char * host,BOOL recordrout=FALSE,int size=DEF_PACKET_SIZE);

void DecodeIPOptions(char *buf, int bytes); void Cleanup();

void Ping(int timeout =1000); SOCKET m_hSocket;

IpOptionHeader m_ipopt; SOCKADDR_IN m_addrDest; SOCKADDR_IN m_addrFrom;

char *icmp_data; char *recvbuf; USHORT seq_no ; char *lpdest; int datasize; BOOL m_bRecordRout; CMyPingDlg * m_dlg; CPing(CMyPingDlg *dlg); virtual ~CPing();

private:

void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN* from); USHORT checksum(USHORT *buffer, int size);

void FillICMPData(char *icmp_data, int datasize); };

#endif

// !defined(AFX_PING_H__DD196130_22F6_48DA_BAFC_B799A0034437__INCLUDED_)

-----------------------------------------ping.cpp--------------------------------------------

// Ping.cpp: implementation of the CPing class. //

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

#include \"stdafx.h\" #include \"MyPing.h\" #include \"Ping.h\"

#include \"MyPingDlg.h\"

#ifdef _DEBUG #undef THIS_FILE

static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif

CString DNS_IP=\"\";

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

// Construction/Destruction

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

CPing::CPing(CMyPingDlg * dlg) {

m_dlg=dlg;

icmp_data = NULL; seq_no = 0;

recvbuf = NULL;

m_bRecordRout = FALSE; lpdest = NULL;

datasize = DEF_PACKET_SIZE;

WSADATA wsaData;

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {

AfxMessageBox(\"Sorry, you cannot load socket dll!\"); return ; }

m_hSocket = INVALID_SOCKET; }

CPing::~CPing() {

if(lpdest)

delete []lpdest; }

void CPing::Ping(int timeout) {

m_hSocket = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED); if (m_hSocket == INVALID_SOCKET) {

AfxMessageBox(\"socket 创建失败!\"); return ; }

if (m_bRecordRout) {

// Setup the IP option header to go out on every ICMP packet //

ZeroMemory(&m_ipopt, sizeof(m_ipopt));

m_ipopt.code = IP_RECORD_ROUTE; // Record route option

m_ipopt.ptr = 4; // Point to the first addr offset m_ipopt.len = 39; // Length of option header

int ret = setsockopt(m_hSocket, IPPROTO_IP, IP_OPTIONS, (char *)&m_ipopt, sizeof(m_ipopt)); if (ret == SOCKET_ERROR) {

AfxMessageBox(\"设置socket协议选项错误!\"); } }

// Set the send/recv timeout values

//

int bread = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); if(bread == SOCKET_ERROR) {

AfxMessageBox(\"设置socket接收超时选项错误!\"); return ; }

timeout = 1000;

bread = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)); if (bread == SOCKET_ERROR) {

AfxMessageBox(\"设置socket发送超时选项错误!\"); return ; }

memset(&m_addrDest, 0, sizeof(m_addrDest)); //

// Resolve the endpoint's name if necessary //

m_addrDest.sin_family = AF_INET;

if ((m_addrDest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE) {

struct hostent *hp = NULL;

if ((hp = gethostbyname(lpdest)) != NULL) {

memcpy(&(m_addrDest.sin_addr), hp->h_addr, hp->h_length); m_addrDest.sin_family = hp->h_addrtype; // printf(\"m_addrDest.sin_addr = %s\\n\inet_ntoa(m_addrDest.sin_addr)); } else {

// printf(\"gethostbyname() failed: %d\\n\// WSAGetLastError()); AfxMessageBox(\"输入的主机不存在!\"); return ; }

}

//

// Create the ICMP packet

//

datasize += sizeof(IcmpHeader);

icmp_data =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);

recvbuf =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET); if (!icmp_data) {

AfxMessageBox(\"堆分配错误!\"); return ; }

memset(icmp_data,0,MAX_PACKET); FillICMPData(icmp_data,datasize); //

// Start sending/receiving ICMP packets //

//static int nCount = 0; int nCount=0; while(1) {

int bwrote;

if (nCount++ == 4) break;

((IcmpHeader*)icmp_data)->i_cksum = 0;

((IcmpHeader*)icmp_data)->timestamp = GetTickCount(); ((IcmpHeader*)icmp_data)->i_seq = seq_no++; ((IcmpHeader*)icmp_data)->i_cksum =

checksum((USHORT*)icmp_data, datasize);

bwrote = sendto(m_hSocket, icmp_data, datasize, 0, (struct sockaddr*)&m_addrDest, sizeof(m_addrDest));

if (bwrote == SOCKET_ERROR) {

if (WSAGetLastError() == WSAETIMEDOUT) {

m_dlg->m_result+=\"Timed out ! \\r\\n\";

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); continue; }

AfxMessageBox(\"发送数据函数调用错误!\");

return ; }

if (bwrote < datasize) {

CString temp;

temp.Format(\"Wrote %d bytes \\r\\n\ m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); }

int fromlen = sizeof(m_addrFrom);

bread = recvfrom(m_hSocket, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&m_addrFrom, &fromlen); if (bread == SOCKET_ERROR) {

if (WSAGetLastError() == WSAETIMEDOUT) {

m_dlg->m_result+=\"Timed out !\\r\\n\";

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); continue; }

AfxMessageBox(\"接收数据函数调用错误!\"); return ; }

DecodeICMPHeader(recvbuf, bread, &m_addrFrom);

}

if(DNS_IP!=\"\")//不等于空时表示ping通有IP了 {

AfxMessageBox(\"解析出域名IP:\"+DNS_IP); } }

void CPing::Cleanup() {

if (m_hSocket != INVALID_SOCKET) closesocket(m_hSocket);

HeapFree(GetProcessHeap(), 0, recvbuf); HeapFree(GetProcessHeap(), 0, icmp_data); // WSACleanup(); return ;

}

void CPing::FillICMPData(char *icmp_data, int datasize) {

IcmpHeader *icmp_hdr = NULL; char *datapart = NULL;

icmp_hdr = (IcmpHeader*)icmp_data;

icmp_hdr->i_type = ICMP_ECHO; // Request an ICMP echo icmp_hdr->i_code = 0;

icmp_hdr->i_id = (USHORT)GetCurrentProcessId(); icmp_hdr->i_cksum = 0; icmp_hdr->i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader); }

void CPing::DecodeIPOptions(char *buf, int bytes) {

IpOptionHeader *ipopt = NULL; IN_ADDR inaddr; int i;

HOSTENT *host = NULL;

ipopt = (IpOptionHeader *)(buf + 20);

m_dlg->m_result+=\"Ping 结果: \\r\\n\";

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); for(i = 0; i < (ipopt->ptr / 4) - 1; i++) {

inaddr.S_un.S_addr = ipopt->addr[i]; if (i != 0) {

// m_dlg->m_result+=\" \";

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); }

host = gethostbyaddr((char *)&inaddr.S_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);

CString temp; if (host) {

temp.Format(\"(%-15s) %s \\r\\n\ m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result);

}

else {

temp.Format(\"(%-15s)\\r\\n\ m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); } }

return; }

USHORT CPing::checksum(USHORT *buffer, int size) {

unsigned long cksum=0;

while (size > 1) {

cksum += *buffer++;

size -= sizeof(USHORT); }

if (size) {

cksum += *(UCHAR*)buffer; }

cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); }

void CPing::SetConfigure(char * host,BOOL recordrout,int size) {

if(lpdest) {

delete[] lpdest; lpdest=NULL; }

m_bRecordRout = recordrout; datasize = size;

lpdest = new char [strlen(host)+1]; strcpy(lpdest,host); }

void CPing::DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN *from)

{

IpHeader *iphdr = NULL; IcmpHeader *icmphdr = NULL; unsigned short iphdrlen; DWORD tick;

static int icmpcount = 0; iphdr = (IpHeader *)buf;

// Number of 32-bit words * 4 = bytes iphdrlen = iphdr->h_len * 4; tick = GetTickCount();

if ((iphdrlen == MAX_IP_HDR_SIZE) && (!icmpcount)) DecodeIPOptions(buf, bytes);

CString temp;

if (bytes < iphdrlen + ICMP_MIN) {

temp.Format(\"Too few bytes from %s \\r\\n\ m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); }

icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr->i_type != ICMP_ECHOREPLY) {

temp.Format(\"nonecho type %d recvd \\r\\n\ m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); return; }

// Make sure this is an ICMP reply to something we sent! //

if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {

temp.Format(\"someone else's packet! \\r\\n\"); m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); return ; }

DNS_IP=inet_ntoa(from->sin_addr);

temp.Format(\"%d bytes from %s: \\r\\n\bytes, inet_ntoa(from->sin_addr)); m_dlg->m_result+=temp;

temp.Format(\" icmp_seq = %d. \\r\\n\

m_dlg->m_result+=temp;

temp.Format(\" time: %d ms \\r\\n\ m_dlg->m_result+=temp;

m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result); icmpcount++; return; }

---------------------外部调用的函数***dlg.cpp----------------------- extern CString DNS_IP; void CMyPingDlg::OnPing() {

// TODO: Add your control notification handler code here CButton* checkbox=(CButton*)GetDlgItem(IDC_CHECK_ROUTE); int state=checkbox->GetCheck(); char host[100];

GetDlgItemText(IDC_HOST,host,100); m_pinger.SetConfigure(host,state); m_pinger.Ping();

m_result+=\"ping 完成!\\r\\n--------------------\\r\\n\"; SetDlgItemText(IDC_EDIT2,m_result); UpdateData(TRUE); m_dnsip=DNS_IP; UpdateData(FALSE);

m_pinger.Cleanup(); }

附注1:源程序已上传至邮箱,即取即用.

本例有个特点:封装性特别好.ping.h与ping.cpp直接包含进去,然后把***dlg.cpp中按钮响应的代码添加进去,就可以了 附注2:在次申明:本例仅为学习.来源ping程序的扩展

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务