2013-03-20 112 views
2

我发送DNS数据包(类型A)通过原始套接字。我的默认DNS服务器得到了很好的结果 问题是我的代码卡在“recvfrom”中,我可以看到传出的请求数据包和通过wireshark传入的答案(没有错误)。我尝试使用不同套接字进行传出和传入数据包的所有操作,尝试“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 2013-03-22 13:35:10

回答