2013-03-20 2 views
2

원시 소켓을 통해 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; 

}

+0

감사합니다. @ 2to1mux, 나는 마침내 성공했습니다. 나는 어딘가에서 원시 소켓에 바인딩 할 수 없다는 것을 읽는다 (바인딩은 전송 레이어 개념이다). 그리고 나는 wireshark 목적지 포트에 도달 할 수 없으므로, 들어오는 패킷을위한 또 다른 소켓을 열고 들어오는 패킷 목적지 포트에 소켓을 묶는다. 감사! – user2192421

답변

관련 문제