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