Функция recv зависает, даже если отправка прошла успешно - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь отправить запрос DNS на сервер DNS. хотя моя функция отправки работает, но функция 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 голосов
/ 17 октября 2019

Я решил проблему. проблема была в моей структуре заголовка днс. Я объявил это так:

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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...