【问题标题】:When source_address of python socket.create_connection is used? [closed]什么时候使用python socket.create_connection的source_address? [关闭]
【发布时间】:2013-08-01 11:05:30
【问题描述】:
socket.create_connection(address[, timeout[, source_address]])

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

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    正如the documentation 所说:

    如果提供,source_address 必须是一个 2 元组(hostport),以便在连接之前将套接字绑定为其源地址。如果主机或端口分别为“”或 0,则将使用操作系统默认行为。

    也就是说,当你需要在连接之前bind 套接字时使用它。如果你不知道为什么你需要这样做,你就不需要这样做。但这里有一个示例的简短草图: FTP 服务器需要能够在与传入控制连接相同的接口上建立传出数据连接。您可以通过绑定与控制连接相同的本地地址来做到这一点。所以:

    def make_data_conn(controlconn, port, timeout):
        return socket.create_connection((controlconn.getpeername()[0], port),
                                        timeout,
                                        (controlconn.getsockname()[0], 0))
    

    【讨论】:

    • 不需要显示文档链接
    • @metaphy:即使你已经阅读了这些文档并在你面前打开了它们,问题和答案也应该对未来寻找类似问题的其他人有所帮助,而且许多这些人中需要文档链接。
    • 但是这个问题被否决了,所以这不是一个有用的问题。
    • @metaphy 奇怪的态度。为了使答案更有帮助,文档链接总是有帮助的。
    • @metaphy 由于被否决的问题,答案怎么没有帮助?!
    【解决方案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)
    

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

    【讨论】:

    • 这不是任何事情的答案,更不用说你的问题了。
    • 等我知道了再回答。
    • 好的……但在那之前,不要用无用和/或令人困惑的东西把 SO 搞得一团糟。删除您的答案,并在您准备好写答案时创建一个新答案。
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2012-09-19
    • 1970-01-01
    • 2012-06-21
    • 2013-05-25
    • 2010-09-06
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多