我正在尝试为服务器应用程序指定基础,其目的是...
1'接收'tcp和/或udp数据包
2解释内容(即标题值)
要添加更多详细信息,此服务器将收到“sip邀请”并以“302重定向”进行回复。
我有使用Net :: Pcap和perl的经验,并知道我可以通过循环过滤数据包,解码然后使用Net :: SIP之类的东西来实现这一点。
然而,在我不需要的这些模块/应用程序中存在很多膨胀。服务器负载很重,如果我自己运行TCPDUMP,它会因服务器负载而丢失内核中的数据包,所以担心它不合适:(
我是否可以通过'监听'套接字(例如使用IO :: Socket)和解码数据包来实现相同的功能?
不幸的是,通过调试,很难判断IO :: Socket是否会让我有机会看到原始数据包?相反,它会自动将消息解码为可读格式!
tl; dr:我想捕获大量的SIP邀请,分析头部值,并使用SIP 302重定向进行响应。有没有比使用tcpdump(通过Net :: Pcap)更好的方法来实现这个目标?
谢谢, 驼鹿
答案 0 :(得分:1)
有没有比使用tcpdump(通过Net :: Pcap)更好的方法来实现这个目标?
是。使用libpcap(这就是你在那个问题中的意思而不是tcpdump)是实现基于TCP的服务的坏方式,因为你必须自己重新实现大部分TCP(libpcap为你提供原始网络 - 层数据包),和您的程序获取的数据包也将被传送到您计算机上的Internet协议栈,因此:
对UDP来说并不是更好:
IO:Socket
可能不会给你原始数据包,这是好东西;您不必实现自己的IP和TCP / UDP堆栈。如果您的目标是在您的计算机上实施redirect server,则无需接收原始数据包;您希望通过机器的IP / TCP / UDP堆栈为您完成所有较低级别处理的SIP INVITE。
如果您的计算机上已经有SIP实施,并且您希望充当它的“防火墙”,那么对于某些INVITE,您会发回302重定向并阻止您的计算机上的SIP实施看到有问题的INVITE,您将需要使用您的特定操作系统用于实现防火墙的相同机制。据我所知,这些机制没有类似libpcap的包装器。