我正在尝试将dns查询发送到dns服务器。 即使我的send函数正常工作,但是recv函数也不会返回任何该函数。 它也不给出任何错误。 它在“正在接收答案...”行之后卡住
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(53);
dest.sin_addr.s_addr = inet_addr("208.67.222.222"); //dns servers
int s;
s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP);
int query_size=sizeof(struct DNS_HEADER) + (strlen((const char*)domain)+1) + 4;
printf("\n\nquery size - %d",query_size);
int cs=connect(s,(struct sockaddr*)&dest,sizeof(dest));
if(cs==0)
{
printf("\n\nconnect success\n\n");
}
printf("\nSending Packet...");
if( send(s,(char*)buf,query_size,0) < 0)
{
perror("sendto failed");
}
printf("Done");
//Receive the answer
i = sizeof(struct sockaddr_in);
printf("\nReceiving answer...");
if(recv(s,(char*)buf , 65536,0) < 0)
{
perror("recvfrom failed");
}
printf("Done");
答案 0 :(得分:0)
我已经解决了问题。问题出在我的dns标头结构中。我这样宣布
struct DNS_HEADER
{
unsigned short id;
unsigned char qr :1;
unsigned char opcode :4;
unsigned char aa :1;
unsigned char tc: 1;
unsigned char rd: 1;
unsigned char ra: 1;
unsigned char z :3;
unsigned char rcode :4;
unsigned short qdcount;
unsigned short ancount;
unsigned short nscount;
unsigned short arcount;
};
这里的问题是。标志字节没有按网络字节顺序转换。当我重新排列结构变量时,它起作用了。
struct DNS_HEADER
{
unsigned short id; // identification number
unsigned char rd :1; // recursion desired
unsigned char tc :1; // truncated message
unsigned char aa :1; // authoritive answer
unsigned char opcode :4; // purpose of message
unsigned char qr :1; // query/response flag
unsigned char rcode :4; // response code
unsigned char cd :1; // checking disabled
unsigned char ad :1; // authenticated data
unsigned char z :1; // its z! reserved
unsigned char ra :1; // recursion available
unsigned short qdcount; // number of question entries
unsigned short ancount; // number of answer entries
unsigned short nscount; // number of authority entries
unsigned short arcount; // number of resource entries
};