使用套接字API在C中转发UDP数据包

时间:2012-10-16 22:18:30

标签: c sockets udp ip

我正在使用将拦截DNS请求的套接字API在C中编写内容过滤器,并且仅在允许域时才返回响应。描述这个的伪代码是:

  1. 将所有DNS查询重定向到正在侦听UDP端口X的内容过滤器程序。
  2. 内容过滤器程序提取正在查询的域并确定是否允许。
  3. 如果允许,则内容过滤器程序将原始DNS请求包转发到原始目标DNS服务器,同时保持原始源和IP +端口,以便DNS服务器可以将回复直接发送回客户端。 / LI>
  4. 如果不允许域名,则不会发送回复。
  5. 我目前有程序监听UDP端口X,但问题是我无法访问IP标头,因此不能简单地将DNS请求转发到原始服务器,同时保留原始标头。

    我尝试过使用socket(AF_INET, SOCK_RAW, IPPROTO_UDP)但是没有在端口X上绑定(可以理解),并且没有收到任何流量。

    关于侦听UDP端口X的最佳方法是什么,同时仍然能够访问传入数据包的IP头?

2 个答案:

答案 0 :(得分:1)

我认为在UDP套接字上的recvfrom应该为您提供正确的源地址。您可能仍需要一个原始套接字来转发消息。

答案 1 :(得分:0)

基于SOCK_RAW的套接字的功能因您所在的平台而异。通常,当您想要访问完整的IP数据报信息时,我建议使用Berkeley Packet Filter来点击寻址到感兴趣的UDP端口的数据链路层帧。