【问题标题】:What is `conn, addr = s.accept()` in python socket?python socket中的`conn,addr = s.accept()`是什么?
【发布时间】:2021-03-18 04:15:50
【问题描述】:

我搜索了文档和教程,但没有人谈论这个,例如这是服务器脚本

import socket
 
server = socket.socket()
print("socket created")

server.bind(("localhost", 9999))
server.listen(3)
print("waiting for connection")

while True:
    client, addr = server.accept()
    print(client)
    print(addr)
    
    name = client.recv(1024).decode()
    print("connected with", addr, client, name)
    
    client.send(b"welcome bro")       
    client.close()

 

打印client 时,我得到这个:

proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 36182)

还有addr 变量:

('127.0.0.1', 36182)

为什么这两个变量由一个定义得到两个不同的输出?

幕后的逻辑是什么?

【问题讨论】:

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


    【解决方案1】:

    accept() 函数返回连接到您的 TCP 服务器的套接字描述符。在这种情况下,它返回一个对象元组。

    第一个参数conn 是一个套接字对象,您可以使用它向已连接的客户端发送数据和从其接收数据。

    第二个参数addr 包含有关已连接客户端的地址信息(例如,IP 地址和远程部分)。

    【讨论】:

      【解决方案2】:

      来自documentation of the socked module

      socket.accept()

      接受连接。套接字必须绑定到 地址和监听连接。返回值是一对 (conn, address) 其中 conn 是一个新的套接字对象,可用于发送和 在连接上接收数据,地址是绑定到的地址 连接另一端的套接字。

      【讨论】:

        【解决方案3】:

        脚本本身不会回答这个问题,但是,我假设 laddr=('127.0.0.1', 9999) 是服务器端应用程序的监听地址。这就是建立连接的地方。 raddr 是请求来自的连接端口。当您使用服务器监听端口时,客户端使用任何非保留端口>1024 连接到服务器,这完全是随机的,只要它在客户端应用程序中定义即可。

        因此,您必须为一个已建立的连接使用不同的连接点。一个端口和地址作为发送方(描述为 raddr),一个作为接收方(这里描述为 laddr - 用于监听)

        这基本上是任何 TCP 相关连接背后的逻辑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          • 1970-01-01
          • 2015-12-08
          • 2020-08-21
          • 1970-01-01
          • 2013-04-20
          • 2011-09-23
          相关资源
          最近更新 更多