如何在socket编程中选择端口?

时间:2015-09-22 21:42:51

标签: python sockets

我目前正在学习python中的套接字编程,我很困惑如何为我的服务器选择端口来监听。我知道我不能选择一些特定的范围(最多3000或者什么?),所以我选择了超出该数字的端口(确切地说是7777)。

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

有时当我运行我的程序时,python intepreter会说:

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)

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

感谢您的所有答案!

1 个答案:

答案 0 :(得分:3)

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

如果您希望操作系统在绑定时为您选择一个端口,则可以绑定到端口零。然后,您可以使用sed -n '/\(pattern1\|pattern2\|pattern3\)/p' file > newfile 找出分配的端口。例如:

getsockname

端口号是一个短整数(16位),因此它们的范围是0-65535。低于1000的端口通常保留用于“已知”服务,如上所述,并且服务于它们的服务通常需要以root身份运行。