-5
socket.create_connection(address[, timeout[, source_address]])

有什么例子可以说明 source_address 的用法吗?

4

2 回答 2

3

正如文档所说:

如果提供,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))
于 2013-07-31T19:01:33.170 回答
-2

我的问题很清楚。现在,我知道答案了。

我知道如何检查源代码,我阅读了方法 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)

您可以切换两个测试功能以查看差异。

于 2013-07-31T19:39:33.303 回答