socket.create_connection(address[, timeout[, source_address]])
source_address の使用法を示す例はありますか?
ドキュメントが言うように:
指定する場合は、ソケットが接続前にソース アドレスとしてバインドする
source_address
2 タプル (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))
私の質問は十分に明確です。今、私は答えを知っています。
ソースコードを調べる方法を知っています。メソッド 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 つのテスト関数を切り替えて違いを確認できます。