gpt4 book ai didi

python - socket编程中如何选择端口?

转载 作者:行者123 更新时间:2023-11-28 22:41:19 25 4
gpt4 key购买 nike

我目前正在学习 python 套接字编程,但我对如何为我的服务器选择要监听的端口感到困惑。我知道我无法选择某个特定范围(最多 3000 或什么?),所以我选择了超出该数字(准确地说是 7777)的端口。

在我的场景中,我想使用不同数量的服务器(12 的倍数到 96)来测试我的程序。到目前为止,我正在用 12 个服务器代码测试我的程序,将主机分配给 localhost,端口号从 77777788

有时当我运行我的程序时,python 解释器会说:

Traceback (most recent call last):
File "/home/myUserName/sockettutorial/sockettest4/ppc1/dir12/nwserver12.py", line 9, in <module>
s.bind((host,port))
File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

尽管我已经杀死了所有可能仍然监听所述端口的相关进程(使用 netstat -plan 检查这些进程的 PID)。

我已将此部分包含在我的服务器代码中:

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

我的问题是,尽管有错误,程序仍按预期运行,有时当我运行我的程序时,我根本没有收到此错误,有时却收到了。但是,这个错误本身有点烦人,如果我想摆脱它,有什么办法让机器/主机为服务器分配可用端口,还是我必须手动分配它们?

谢谢大家的回答!

最佳答案

将服务器绑定(bind)到端口以监听传入连接时,需要指定端口。许多服务都有一个默认运行的“标准”端口,例如HTTP:80,HTTPS:443,SSH:22。这是为了让客户端在连接时知道将数据发送到哪个端口(如果某个端口位于随机端口,则客户端无法连接)。

如果你想让操作系统在你绑定(bind)时为你选择一个端口,你可以绑定(bind)到端口零。然后,您可以使用 getsockname 找出分配给您的端口。示例:

>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.bind(('127.0.0.1', 0))
>>> s.getsockname()
('127.0.0.1', 42171)

端口号是一个 short int(16 位),因此它们的范围是 0-65535。低于 1000 的端口通常保留给“已知”服务,如上面提到的那些,服务于它们的服务通常需要以根用户身份运行。

关于python - socket编程中如何选择端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32727430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com