2012-03-14 24 views
2

私は次のエコーサーバをpythonで書きました。 http://ilab.cs.byu.edu/python/socket/echoserver.html(私はここからコードをコピーしたと思います。)バインドコールでは何が起こっていますか? (python + socket + strace)

#!/usr/bin/env python 

import socket 

host = '' 
port = 50000 
backlog = 5 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host, port)) 

は、それから私は、straceの-oを/ tmp/somefileという-v ipython を実行し、線でコード行の断片を挿入し始めました。

出力のほとんどは意味がありますが、私は以下のことを理解できません。

bind(4, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0 
getsockname(4, {sa_family=AF_NETLINK, pid=3084, groups=00000000}, [12]) = 0 
sendto(4, "\24\0\0\0\26\0\1\3\300EPO\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20 
recvmsg(4, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\300EPO\f\f\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 108 
recvmsg(4, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\300EPO\f\f\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 128 
recvmsg(4, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\300EPO\f\f\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20 
close(4)   

上記のstrace出力のあとに、次の出力が続きます。上記の出力はpython2.6でのみ発生します。

listen(3, 5)                            = 0 
accept(3, {sa_family=AF_INET, sin_port=htons(45636), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4 
recvfrom(4, "Hey", 1024, 0, NULL, NULL) = 3 
sendto(4, "Heyback", 7, 0, NULL, 0)     = 7 
close(4)                                = 0 
accept(3, 0x7fffdac55fe0, [16])         = ? ERESTARTSYS (To be restarted) 

これは学術的な運動の詳細です、サーバはうまく動作しますが、私はファイルディスクリプタ4で何が起こっているかを知るのが好きだろうか?なぜpython2.6でしか発生しないのですか?私はその行が

socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE) = 4 

man 7 netlinkのようなものが先行することを期待したい

答えて

3

は私たちに送られているものの形式を伝え、私たちは

struct nlmsghdr _ = { 
    .nlmsglen = 20, 
    .nlmsg_type = RTM_GETADDR, 
    .nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT | NLM_F_MATCH; 
    .nlmsg_seq = 1330660800, 
    .nlmsg_pid = 0, 
}; 
の連結として送信されたメッセージをデコードすることができます

といくつかの4バイトのゼロ。

RTM_GETADDRとは何ですか? man 7 rtnetlinkには、各インタフェースに関するIPアドレス情報の要求が記載されています。応答の本文のstruct ifaddrmsgをデコードすることができますが、それぞれの先頭のnetlinkヘッダーは、straceによってデータ出力を短くします。

いずれにしても、bindに電話するには、ここで停止してstruct sockaddr_inに必要な情報を取得するだけで済みます。結局のところ、あなたは空のノード名を渡してしまったので、うまくいくことはありません。これを確認し、'''0.0.0.0'に変更すると(「任意のインターフェイスの任意のアドレスにバインド」)、この小さな交換は表示されなくなります。

関連する問題