【问题标题】:Why am I getting a ConnectionResetError for my basic python UDP client?为什么我的基本 python UDP 客户端出现 ConnectionResetError?
【发布时间】:2021-04-09 06:00:44
【问题描述】:

我在 VMWare Workstation 16 Player 上使用 2020.4 Kali Linux VM,并且正在使用 Justin Seitz 的 Black Hat Python 书。在第 2 章的开头,他介绍了一个基本的 UDP 客户端,但由于某种原因,我每次都会抛出 ConnectionResetError,因为我发送的端口或接收的端口都被占用了。然后我添加了一行以使其绑定到我要发送的地址并且它有效。当我 sendto() 时它不会自动绑定吗?如果我在进行渗透测试,我在制作 UDP 客户端时不需要密码/管理员来绑定。

这是我的代码:

import socket


address = ('127.0.0.1', 80)

# Create a socket object.
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# I commented this out just for testing reasons.
# client.bind(address)

# Send some data.
client.sendto(b'AAABBBCCC', address)

# Receive some data.
data, addr = client.recvfrom(4096)

print(data)

错误如下:

Traceback (most recent call last):
  File ".\udp_client.py", line 15, in <module>
    data, addr = client.recvfrom(4096)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

如果这是我的一些愚蠢的错误,我提前道歉。

编辑:

我更改了代码以使用不同的端口 (65536),但现在它只是不打印任何内容或结束脚本,它只是继续运行。

【问题讨论】:

    标签: python sockets udp udpclient


    【解决方案1】:

    我建议您尝试使用端口 80(所有 HTTP 流量的默认端口)以外的端口,该端口可能会经常使用,并且不是一个值得尝试的好端口,请尝试端口号 > 1023

    【讨论】:

    • 它确实摆脱了我的错误,但现在它不会在控制台上打印任何内容,甚至根本不会结束。
    • 一定是你接收数据的那一行:client.recvdata(4096) 保持连接等待数据,服务器是否接收到你一开始发送的数据成功?通过在服务器端打印该数据进行仔细检查
    • 我使用的 IP 是环回 IP,也就是本地主机,所以它应该接收我在 sendto() 调用中发送给自己的字符串。传入 recvfrom() 的缓冲区大小也足够大。
    • 您需要运行一个单独的服务器进程来等待该数据,您不能在同一个进程上发送和接收。这有点无关紧要,但环回与 localhost 不同。
    • 好吧,我的错,这本书没有提到它需要一个服务器,也没有告诉我如何编写一个 UDP 服务器,所以我才发现它有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2023-01-13
    • 2020-11-25
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多