因此,我在C中创建了一个DNS代理。我使用DIG作为客户端程序;它向我的服务器发送一个查询包,我的服务器将其转发到DNS,我的服务器接收答案,然后将它们发送回客户端。
我的服务器绑定到UDP套接字;我正在通过TCP传输DNS数据包。但是,我的recv()调用(从TCP套接字)总是返回0。我将得到原始查询,但没有答案。
代码:
fromlen=sizeof(client);
recvfrom(UDPSock,buffer,sizeof(buffer),0,(struct sockaddr *)&client,&fromlen); //receive from client
int msglen=strlen(buffer);
connect(TCPSock,(struct sockaddr*) &dest, sizeof(dest)); //connect to DNS
int m=send(TCPSock,buffer,msglen,0); //send packet to dns
recv(TCPSock,buffer,sizeof(buffer),0); //this returns 0
//send back
sendto(UDPSock,buffer,sizeof(buffer),0,(struct sockaddr *)&client,fromlen); //send message back`
缓冲区为300字节。
发布于 2011-02-27 23:48:22
您当前面临的问题是您没有使用正确的协议。DNS/TCP/IP协议与DNS/UDP/IP协议不同。阅读描述协议的RFC并遵循它们。
你更基本的问题是你的代码的设计问题。在前端只有UDP/IP的情况下,在后端使用每个查询一个连接的TCP/IP是没有意义的,尤其是在网络开销方面。此外:正确编写的forwarding proxy DNS server必须处理大的UDP/IP分组、截断的响应、截断的和其他格式错误的查询、TCP/IP连接超时和重置、循环检测以及DNS/UDP/IP重试。但这超出了问题的范围。
发布于 2011-02-27 21:00:05
除了不检查任何系统调用的错误之外,一个很大的问题是strlen(3)
的使用。recvfrom(2)
告诉你它在你的缓冲区中放了多少字节(或者-1
表示错误)。这些字节中的一些可能具有零值,因此strlen(2)
在这种情况下根本不适用。修复它,看看它是否有帮助。否则,您必须解释为什么要通过TCP转发,并在每个数据包上进行连接。
发布于 2011-02-28 00:51:50
当另一端断开连接时,recv()返回0。因此,您使另一端断开连接,而不是发送任何数据。它可能不理解您发送的内容。
https://stackoverflow.com/questions/5135758
复制相似问题