哪种语言更适合编程原始套接字?
Ruby的PacketFu没有太多文档。
到目前为止,我一直在使用C,但我想知道是否有替代方案。
答案 0 :(得分:0)
原始套接字也很容易3}},必须使此代码适应x64程序集,请参阅此http://sock-raw.org/)
python中的数据包嗅探器(接口必须设置为 promiscous mode ):
import socket
import os
# host to listen
HOST = '192.168.1.114'
def sniffing(host, win, socket_prot):
while 1:
sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_prot)
sniffer.bind((host, 0))
# include the IP headers in the captured packets
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
if win == 1:
sniffer.ioctl(socket.SIO_RCVALL, socket_RCVALL_ON)
# read in a single packet
print sniffer.recvfrom(65565)
def main(host):
if os.name == 'nt':
sniffing(host, 1, socket.IPPROTO_IP)
else:
sniffing(host, 0, socket.IPPROTO_ICMP)
if __name__ == '__main__':
main(HOST)
复制
答案 1 :(得分:0)
根据我的经验(主要是Ruby和C),原始套接字在大多数语言中都很容易使用。
您可能会考虑的问题是:
您将使用什么来轮询套接字数据?
即。 select
限制为1024个套接字,如果您无法访问kqueue
(BSD)或epoll
(Linux),则会受到连接限制(您可能会或可能会受到限制)不关心)。
您的套接字提供什么服务?
有些语言可以轻松地进行字符串操作,提供开箱即用的正则表达式和其他工具。拥有GC可能是一个性能问题,但它确实可以更容易地编写很多东西。
Raw套接字只是一层,我会考虑等式中的其他层。
对于Ruby工具,很多人使用EM(事件机器),我不太喜欢它。拥有这个强大的开发者社区应该对宝石有积极的影响,所以这可能是一个不错的选择。
我还注意到Faye和Rails(ActionCable)选择了一个看起来很有前途的不同的库nio4r
。拥有这些强大的社区支持nio4r
将极大地改善图书馆(以libev
为基础)。
我开始为自己的项目编写一个库(最初是在Ruby中,然后是在C语言中使用Ruby桥)...它仍处于开发阶段,但我正在写这篇文章,如果我设法做到了,它不会那么难; - )
祝你好运!