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

source_address の使用法を示す例はありますか?

4

2 に答える 2

3

ドキュメントが言うように:

指定する場合は、ソケットが接続前にソース アドレスとしてバインドするsource_address2 タプル ( host, ) である必要があります。portホストまたはポートがそれぞれ '' または 0 の場合、OS のデフォルトの動作が使用されます。

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 を要求しました。バインディングに関するすべてです。私は初心者であり、ソケットプログラミングの背景知識がないため、この質問があります。そのため、「Foundations of Python Network Programming」という本を読んでいます。第 3 章 TCP の「会話ごとに 1 つのソケット」セクションで、私はそれを入手して例を作成しました。

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)

2 つのテスト関数を切り替えて違いを確認できます。

于 2013-07-31T19:39:33.303 に答える