编码转向套接字/它们是如何工作的?
转向套接字与原始 IP 套接字非常相似。它们之间的一个主要区别是,转向套接字不是绑定到 IP 地址,而是绑定到程序员定义的转向端口,就像原始 IP 套接字一样。IPFW 程序或其他数据包过滤器用于匹配您希望套接字接收的数据包,一旦匹配到,它就可以转向或复制数据包。
没有。复制是将数据包的副本发送到您的转向套接字的过程,而转向则完全阻止数据包继续向上网络堆栈,并需要应用程序将其重新注入网络堆栈中。如果您只想捕获数据包,复制通常是一个好主意。
接收传入和传出数据包是通过 read()、recv() 和 recvfrom() 调用中的任何一个完成的。在最后一个函数中,返回的地址端口是数据包过滤器设置的标签。在这种情况下,IPFW 会将端口设置为转向数据包的匹配规则的规则编号。至于 IP 地址字段,传入的数据包将触发将返回的 IP 地址设置为接收数据包的设备。设备的 BSD 名称将放置在地址的最后 8 个字节中,假设它适合。否则,当接收传出数据包时,IP 地址将简单地设置为 INADDR_ANY,并且返回地址的最后 8 个字节将为 null。
发送数据包的工作方式与原始 IP 套接字相同。您可以通过使用 write()、send() 或 sendto() 调用中的任何一个来通过套接字发送数据包。在后一种情况下,INADDR_ANY 的目标地址将导致数据包被视为传出数据包。任何其他地址都将导致数据包被视为传入数据包。
当原始数据包进入 IP 处理时,很少进行错误检查(就像原始 IP 套接字一样)。如果您发送一个具有错误 IP 校验和的数据包,它将发送一个具有错误 IP 校验和的数据包,并且不会报告任何错误。如果您发送一个数据报长度不正确的数据包,该数据包将被丢弃,并且 errno 将设置为 EINVAL。确保在发送数据包时没有错误是您的责任,否则它将永远丢失在互联网的浩瀚深处。
Send() 更易于使用,但它不允许您明确选择要发送的数据包要接收的设备。如果您毫无头绪,您想要 send(),节省一些调试会话。