python中的socket.accept();如何为连接端口设置客户端

时间:2018-10-13 00:19:27

标签: python python-3.x python-sockets

不是在这里发布一英里长的脚本,而是一个简短的示例:我正在两台运行以下脚本之一的计算机之间创建TCP / IP连接:

服务器:

private int compress(int hashCode) {
    return Math.abs(hashCode) % capacity;
}

客户:

# server.py
import socket

s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))

s.listen(5)

while True:
    c, addr = s.accept()
    print 'Connection from', addr
    c.close()

这给了我一个像这样的准备:

#client.py
import socket

s = socket.socket()

host = socket.socket()
port = 1234

s.connect((host, port))
print s.recv(1024)

什么控制着54451-54454数字的创建?我明白这是什么;分配给客户端连接的端口号。我似乎无法弄清楚如何控制数字,或至少控制其发出的范围。

这甚至可能吗?任何建议将极大地帮助您。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

通常,如果您自己没有分配端口ID,则您的OS或运行时系统会这样做。

尤其是

TCP每个连接具有两个端口:源端口和目标端口,有时称为本地端口和远程端口。使用s.bind可以在服务器上设置 local 端口,而无需设置任何远程端口(这很有意义:尚无实际连接)。使用s.connect可以在客户端上设置远程(目标)端口,而无需设置任何 local 端口。

当您的客户端向服务器发送连接请求时,您的客户端需要一个本地端口。由于还没有,操作系统或运行时系统之类的东西会从可用端口ID池中拾取。然后,它将该ID绑定到客户端套接字s的本地端,并使用以下命令发出请求(我在这里假设使用192.168 RFC-1918专用地址空间):

<local-addr=192.168.xxx.xxx, local-port=54451, remote-addr=S, remote-port=1234>

(其中S是服务器的IP地址)。

服务器看到传入的请求,并使用以下命令创建一个 new 套接字:

<local-addr=S, local-port=1234, remote-addr=192.168.xxx.xxx, remote-port=54451>

您可以看到,这是一对IPaddr +端口号,只是交换了一下。

new 套接字是s.accept在服务器上返回的内容,形式为c

如果要在客户端上分配自己的本地端口,也可以在呼叫bind之前在此呼叫connect

s.bind((0, port))

(零表示“未分配”,因此未设置本地IP地址。您可以设置特定的IP地址,如果主机是多宿主的,则很有用。)