rt
解决方案 »
- 急求好心人帮忙将MFC对话框程序转为ActiveX控件
- 在win32 console程序中能调用dos的图形中断吗?
- 邀请 masterz(www.fruitfruit.com) 、jiangsheng(蒋晟.MSMVP2004Jan) 等高手来帮我看一下这几个贴子
- 如何隐藏和显示ToolBar?
- 如何用程序操纵注册表呀?有没有例子?
- 请教串口通信行家,怎样向串口写入数据
- 怎样注册进程为服务器进程?(详细操作)大给分.
- WritePrinter 如何布局在纸张上的内容
- 汉字字模获取
- 如何去掉dialog在按Esc后自动退出?
- VC6.0是如何编码的?
- 在Windows+VC环境下,写makefile时怎样实现“静态模式”?
//#include "stdafx.h"
#include <stdio.h>
#include"conio.h"
#include <winsock.h>
#include "iphlpapi.h"
#include "windows.h"
#include "MY.h"
/***********************************************
* *
* 计算字符串长度,以 0 , 0xC0结尾 并加1 *
* *
* 参数 = 字符字针 *
* 返回值 = 长度 *
* *
* *
************************************************/
int getStrLenM(BYTE *chStr)
{
int i = 0 ; while(*(chStr+i))
{
if(*(chStr+i) == 0xC0)
{
i++;
break;
}
i++;
} i++; return i ;
};
/**************************************************
DNS函数
char *DNSName = 域名
IpAdd = 返回的IP地址
*************************************************/int DNSLook(char *DNSName,ULONG *IpAdd)
{
//主要配置参数 unsigned short QueryTyep = 15; //查询类型 int DNStimewait = 3 ; //DNS的UDP超时设置,单位秒 /*********************************************
得到DNS服务器IP地址 *********************************************/
int i = 0 ; DWORD dwError = 0 ; //错误代码 FIXED_INFO IpBuff[10]; //IP配置缓冲 unsigned long size = sizeof(IpBuff);//得到缓冲大小 PULONG pSize = &size; dwError = GetNetworkParams(IpBuff,pSize); //执行 if(dwError)
return 1; //错误判断 IP_ADDR_STRING *IpList = &(IpBuff->DnsServerList) ; //得到DNS服务器地址
//得到DNS服务器IP地址结束 /*********************************************
初始化SOCKET连接 *********************************************/
WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); struct sockaddr_in server; server.sin_family=AF_INET; server.sin_port=htons(53); //DNS的server的监听端口
SOCKET s; s = socket(AF_INET,SOCK_DGRAM,0); int len =sizeof(server); BYTE Buff[1024]="\0"; //缓冲 u_long ul = 1;
int nRet = ioctlsocket(s,FIONBIO,(u_long *)&ul); //设置为非锁定模式
if(nRet == -1) printf("非锁定模式设置错误");
//初始化SOCKET连接结束 /*********************************************
发送数据据包构造 *********************************************/
DnsHeader *DNSH;
DNSH = (DnsHeader *)Buff ; DNSH->id = 0x0110 ; DNSH->flags = 0x0001;
DNSH->quests = 0x0100 ;
DNSH->answers = 0 ;
DNSH->author = 0 ;
DNSH->addition = 0; /*-------------------------------------
DNS名称格式 www.17173.com = (3)www(5)17173(3)com DNS名称构造
-------------------------------------*/
i = 0 ; BYTE *p; // "." 的位置
int str = 0 ; //"."后有几位
p = (BYTE *)(Buff+12); //初始位置 while(DNSName[i]) //循环到0
{
if( DNSName[i] == 0x2e) //当前位置为"."时
{
*p = str ; //回到上个"."位写数字
p = (BYTE *)(Buff+13+i); //指针移动当前位
str = -1 ;
}
else
{
*(Buff+13+i) = DNSName[i];
};
str++;
i++;
}
*p = str ; *(Buff+13+i) = 0 ; //最后加0
//DNS名称构造结束 DNSQUERY *Query; Query = (DNSQUERY *)(Buff+14+i); Query->type = htons(QueryTyep); Query->classes = 0x0100;
//发送数据据包构造结束 /*********************************************
发送DNS数据和接收数据 *********************************************/
int DNSLong = 18 + i ; //16位选项 + 2个0的长度 + 字符长度,发送数据包长度 int timesend = 0 ; // BOOL DNSflag = false ; //是否收到数据的标志 for(IpList ; IpList ; IpList = IpList->Next) //遍历所有DNS的IP地址
{
server.sin_addr.s_addr=inet_addr(IpList->IpAddress.String); //DNS的server的地址 网通DNS地址 218.108.248.200 218.108.248.225IpList->IpAddress.String for( i = 0 ; i < 3 ; i++) //每个地址发送3个包
{
if (!sendto(s,(const char *)Buff,DNSLong,0,(struct sockaddr*)&server,len)) //发送数据包
{
closesocket(s);
return 1;
} timesend = time(NULL); //返回到当前秒数
while(((DNStimewait+timesend) >= time(NULL))) //超时返回
{
Sleep(1);
if(recvfrom(s,(char *)Buff,1000,0,(struct sockaddr*)&server,&len) >0 )
{
DNSflag = true; //当收到数据时设为真
break; //退出循环
}
};
if(DNSflag)
break;
}
if(DNSflag)
break;
}
if(!DNSflag)
{
closesocket(s);
printf("DNS服务器不可用");
return 1;
}
//******判断接收的数据包是否正确 if(DNSH->id != 0x0110)
{
closesocket(s);
printf("DNS序列号错误");
return 1;
}
if(!DNSH->addition)
{
closesocket(s);
printf("没有可用域名");
return 1;
}
//=======DNS包发送和接收结束
/*********************************************
解析返回DNS数据包 *********************************************/ int Namele = 12 ; //解析数据位置相对于BUFF的偏移,开始12,跳过12个的DNS头
//解析quests
short temp = ntohs(DNSH->quests); for(temp ; temp ; temp--)
{
Namele += getStrLenM(Buff+12) + 4; } //解析answers
temp = ntohs(DNSH->answers); for(temp ; temp ; temp--)
{
Namele += getStrLenM(Buff+Namele)+12;
Namele += getStrLenM(Buff+Namele);
}
//解析author
temp = ntohs(DNSH->author); for(temp ; temp ; temp--)
{
Namele += getStrLenM(Buff+Namele) + 10;
Namele += getStrLenM(Buff+Namele); }
//解析IP地址
BYTE *TempIP; temp = ntohs(DNSH->addition); int ii = 0 ; for(temp ; temp ; temp--)
{
TempIP = reinterpret_cast<BYTE*>(&IpAdd[ii]); //把IpAdd的首地址传给TempIP, ii++; Namele += getStrLenM(Buff+Namele) + 10;
for( i = 0 ; i < 4 ; i++) //得到IP地址
TempIP[i] = Buff[Namele+i]; Namele += 4;
};
closesocket(s); //关闭socket return 0;
}int main(int argc, CHAR* argv[])
{
char DNSName[] = {"tom.com"}; ULONG IpAdd[20];
memset(IpAdd,0,sizeof(IpAdd)); DNSLook(DNSName,IpAdd);
int i = 0 ; int aa = 0 ;
BYTE *TempIP;
for(IpAdd[i] ; IpAdd[i] ; i++)
{
TempIP = reinterpret_cast<BYTE*>(&IpAdd[i]); //把IpAdd的首地址传给TempIP,-1是为了让IpAdd[0]有数据
printf("\nIP地址为=");
for(aa = 0 ; aa < 4 ; aa++)
printf("%d.",*(TempIP+aa) );
} getch(); return 0 ;
};
{
unsigned short id; //1
unsigned short flags; //2
unsigned short quests; //3
unsigned short answers; //4
unsigned short author; //5
unsigned short addition;//6
}DNS,*PDNS;typedef struct DnsQuery
{
unsigned short type; //1
unsigned short classes;//2
}DNSQUERY,*DNSPQUERY;
typedef struct DnsResponse
{
unsigned short name; //1
unsigned short type; //2
unsigned short classes;//3
unsigned int ttl; //4
unsigned short length;//5
unsigned int addr; //6
}DNSRESPONSE,*DNSPRESPONSE;