私は生のソケットを介してDNSパケット(タイプA)を送信しています。デフォルトのDNSサーバーから良い結果が得られます。問題は、コードが「recvfrom」でスタックすることです。wiresharkを介して送信要求パケットと受信応答を確認できます(エラーなし)。発信パケットと着信パケットに異なるソケットを使用したり、「recv」を試したりするなど、あらゆる種類の操作を試しますが、何も機能しないようです。助けていただければ幸いです。
int main() {
char hostname[100];
//Get the DNS servers from the resolv.conf file
get_dns_servers();
struct sockaddr_in sin;
// dest
sin.sin_family = AF_INET;
sin.sin_port = htons (53);
sin.sin_addr.s_addr = inet_addr (dns_servers[0]);
//Get the hostname from the terminal
cout << "\nEnter Hostname to Poison : ";
scanf("%s" , hostname);
//Create a raw socket of type IPPROTO
int s = socket (AF_INET, SOCK_RAW, IPPROTO_RAW);
if(s == -1)
{
//socket creation failed, may be because of non-root privileges
perror("Failed to create raw socket");
exit(1);
}
dns_packet *pak = new dns_packet("192.168.203.128",(uint16_t) 50115,(in_addr_t) sin.sin_addr.s_addr, (in_port_t) sin.sin_port, (int) 3333, hostname);
//Send the packet
if (sendto (s, pak->datagram, pak->iph->tot_len , 0, (struct sockaddr *) &sin, sizeof (sin)) < 0)
{
perror("sendto failed");
}
//Data send successfully
else
{
printf ("Packet Send. Length : %d \n" , pak->iph->tot_len);
}
//Receive the answer
int i = sizeof(sin);
unsigned char buf[65536];
cout << "\nReceiving answer..." << endl;
if(recvfrom (s,(char*)buf , sizeof(buf) , 0 , (struct sockaddr*)&sin , (socklen_t*)&i ) < 0)
{
perror("recvfrom failed");
}
read_answer(buf);
return 0;
}