gpt4 book ai didi

c - Recv() 从 DNS 查询返回 0 (C)

转载 作者:太空宇宙 更新时间:2023-11-04 01:41:22 27 4
gpt4 key购买 nike

所以我在 C 中创建了一个 DNS 代理。我使用 DIG 作为客户端程序;它向我的服务器发送一个查询数据包,我的服务器将其转发到 DNS,我的服务器收到答案,然后将它们发送回客户端。

我的服务器绑定(bind)到 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 字节。

最佳答案

您的直接问题是您没有使用正确的协议(protocol)。 DNS/TCP/IP 协议(protocol)与 DNS/UDP/IP 协议(protocol)不同。阅读描述协议(protocol)的 RFC 并遵循它们。

您更根本的问题是给定代码的设计问题。当前端只有 UDP/IP 时,在后端有一个每次查询一个连接的 TCP/IP 真的没有意义,尤其是在网络开销方面。此外:正确编写的forwarding proxy DNS server必须应对大型 UDP/IP 数据包、截断响应、截断和其他格式错误的查询、TCP/IP 连接超时和重置、环路检测以及 DNS/UDP/IP 重试。但这超出了问题的范围。

关于c - Recv() 从 DNS 查询返回 0 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com