원시 소켓을 통해 DNS 패킷 (유형 A)을 보내고 있습니다. 내 기본 DNS 서버에서 좋은 결과를 얻을 수 문제는 내 코드가 "recvfrom"에 걸려서, 나가는 요청 패킷과 wireshark (no errors)를 통해 들어오는 응답을 볼 수 있다는 것입니다. 나는 "recv"를 시도하면서 나가는 패킷과 들어오는 패킷에 대해 다른 소켓을 사용하는 것과 같은 모든 종류의 조작을 시도하지만 아무 것도 작동하지 않는 것 같습니다. 나는 어떤 도움을 주셔서 감사합니다.원시 UDP 소켓이 recvfrom에 걸렸습니다
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;
}
감사합니다. @ 2to1mux, 나는 마침내 성공했습니다. 나는 어딘가에서 원시 소켓에 바인딩 할 수 없다는 것을 읽는다 (바인딩은 전송 레이어 개념이다). 그리고 나는 wireshark 목적지 포트에 도달 할 수 없으므로, 들어오는 패킷을위한 또 다른 소켓을 열고 들어오는 패킷 목적지 포트에 소켓을 묶는다. 감사! – user2192421