socket.create_connection(address[, timeout[, source_address]])
有什么例子可以说明 source_address 的用法吗?
正如文档所说:
如果提供,
source_address
则必须是一个 2 元组 (host
,port
),以便在连接之前将套接字绑定为它的源地址。如果主机或端口分别为 '' 或 0,则将使用操作系统默认行为。
换句话说,它是在您需要bind
连接之前使用的套接字时使用的。如果你不知道为什么你需要这样做,你就不需要这样做。但这里有一个示例的简短草图: FTP 服务器需要能够在与传入控制连接相同的接口上建立传出数据连接。您可以通过绑定与控制连接相同的本地地址来做到这一点。所以:
def make_data_conn(controlconn, port, timeout):
return socket.create_connection((controlconn.getpeername()[0], port),
timeout,
(controlconn.getsockname()[0], 0))
我的问题很清楚。现在,我知道答案了。
我知道如何检查源代码,我阅读了方法 socket.create_connection(address[, timeout[, source_address]]) 的源代码,我询问了 source_address,这都是关于绑定的。有这个问题是因为我是初学者,对socket编程没有背景知识,所以找了一本叫《Python网络编程基础》的书看。在 TCP 第 3 章,每次对话一个套接字部分,我得到了它并做了一个例子。
import socket
baidu = ('www.baidu.com', 80)
zero = ('0.0.0.0', 9001)
def test(addr, src_addr):
try:
sock = socket.create_connection(addr, 3, src_addr)
print sock.getsockname()
print
sock.sendall('GET / HTTP/1.1\r\n\r\n')
data = sock.recv(1024)
print data
finally:
try:
sock.close()
except:
pass
test(baidu, zero)
#test(baidu, None)
您可以切换两个测试功能以查看差异。