原始UDP套接字卡住recvfrom
问题描述:
我发送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;
}
答
有没有调用代码中的绑定。您需要绑定到接口,然后才能接收任何内容。
编辑:另外,我注意到你正在使用原始套接字。使用原始套接字时,使用recvmsg()而不是recvfrom()会更容易。这里是recvmsg()的链接:http://www.developer.nokia.com/Community/Wiki/Open_C_Sockets:_recv,_recvfrom,_recvmsg_methods
谢谢@ 2to1mux,我终于成功了。我在某处读到我无法将端口绑定到原始套接字(绑定是传输层概念)。而且我在wireshark目标端口无法访问,所以我打开另一个套接字传入数据包并将套接字绑定到我的传入数据包目标端口。谢谢! – user2192421 2013-03-22 13:35:10