0

我正在编写一个 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)
4

1 回答 1

0

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

于 2021-09-23T19:44:34.470 回答