哪种语言更好地支持原始套接字?

时间:2016-04-21 20:29:30

标签: sockets

哪种语言更适合编程原始套接字?

Ruby的PacketFu没有太多文档。

到目前为止,我一直在使用C,但我想知道是否有替代方案。

2 个答案:

答案 0 :(得分:0)

python https://docs.python.org/2/library/socket.htmlhttp://bt3gl.github.io/black-hat-python-building-a-udp-scanner.html)和程序集({{}中的

原始套接字也很容易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)

64 bit version of socketcall system call Linux

复制

答案 1 :(得分:0)

根据我的经验(主要是Ruby和C),原始套接字在大多数语言中都很容易使用。

您可能会考虑的问题是:

  1. 您将使用什么来轮询套接字数据?

    即。 select限制为1024个套接字,如果您无法访问kqueue(BSD)或epoll(Linux),则会受到连接限制(您可能会或可能会受到限制)不关心)。

  2. 您的套接字提供什么服务?

    有些语言可以轻松地进行字符串操作,提供开箱即用的正则表达式和其他工具。拥有GC可能是一个性能问题,但它确实可以更容易地编写很多东西。

    Raw套接字只是一层,我会考虑等式中的其他层。

  3. 对于Ruby工具,很多人使用EM(事件机器),我不太喜欢它。拥有这个强大的开发者社区应该对宝石有积极的影响,所以这可能是一个不错的选择。

    我还注意到Faye和Rails(ActionCable)选择了一个看起来很有前途的不同的库nio4r。拥有这些强大的社区支持nio4r将极大地改善图书馆(以libev为基础)。

    我开始为自己的项目编写一个库(最初是在Ruby中,然后是在C语言中使用Ruby桥)...它仍处于开发阶段,但我正在写这篇文章,如果我设法做到了,它不会那么难; - )

    祝你好运!