【问题标题】:Reliably detect that no more packets are coming可靠地检测到没有更多的数据包到来
【发布时间】:2021-09-23 17:57:53
【问题描述】:

我正在编写一个 TCP SYN 端口扫描器。我启动了 15 个任务,每个任务将 64K / 15 个数据包发送到 64K 端口,并且我有一个位于循环中并打印响应的接收器。然而,有些数据包并没有返回,导致接收者永远在循环中等待。

我正在寻找一种方法来可靠地检测到没有更多数据包到来,以便我可以重试获取丢失的数据包。

async def recv_from(sock, target):
    while True:
        data, addr = await sock.recvfrom(1024)
        if addr[0] == target:
            yield data

async def receiver() -> None:
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
    ports = list(range(PORTS))
    async for packet in recv_from(sock, '192.168.1.1'):
        if not ports:
            break
        src, dest, flags = unpack(packet)
        if dest == 6969:
            ports.remove(src)
            if flags == 20:
                print("port %d: closed" % src)
            elif flags == 18:
                print("port %d: open" % src)
    sock.close()
    

async def sender(idx: int) -> None:
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
    
    for port in range(idx * int(PORTS / TASKS), (idx + 1) * int(PORTS / TASKS)):
        tcp_packet = build_tcp_packet(port)
        ipv4_packet = build_ipv4_packet()
        await sock.sendto(ipv4_packet + tcp_packet, ('192.168.1.1', port))

    sock.close()


async def main() -> None:
    async with trio.open_nursery() as nursery:
        nursery.start_soon(receiver)
        for i in range(TASKS):
            nursery.start_soon(sender, i)
            await trio.sleep(0.5)

if __name__ == '__main__':
    trio.run(main)

【问题讨论】:

    标签: python tcp python-trio


    【解决方案1】:

    没有办法知道一个数据包是否来了,只能等待并假设如果你没有收到它就认为它没有来。如果你没有收到一个数据包,那么你就没有收到一个数据包——还能说什么呢?由于您没有收到数据包,因此您没有其他信息,因为没有地方可以存放此类信息。

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 2018-07-17
      • 2015-01-17
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 2011-10-14
      • 2016-04-20
      • 1970-01-01
      相关资源
      最近更新 更多