即使发送成功,recv函数也会卡住

时间:2019-10-16 07:13:44

标签: c sockets dns

我正在尝试将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");

1 个答案:

答案 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
};