« [ F# ] F# 1.9.4.17 released | トップページ | [ 備忘録 / ubuntu ] Ubuntu 8.04 Server でキーボードマップを変更する »

2008/05/26

[ 備忘録 / Python ] IPv6 any address

socket.INADDR_ANY は IPv4 用なので IPv6 では使えない。

Linux ならば、IPv6 の場合は setsockopt でソケットオプションを自分で指定することで可能。

import socket
listen_any_address = socket.socket( socket.AF_INET6, socket.SOCK_DGRAM )

listen_any_address.setsockopt( socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0 )
listen_any_address.bind( ("::", 12345) )

netstat で確認すると any address で待ち受けているのが確認できる。

$ netstat -anp | grep udp
udp6    0   0 :::12345      :::*        17343/python

Windows では setsockopt に IPV6_V6ONLY を指定できないのでこの方法は使えません。
Windows 版 Python で IPv6 any address を使用する方法をご存知の方。ご教授お願いします。

|

« [ F# ] F# 1.9.4.17 released | トップページ | [ 備忘録 / ubuntu ] Ubuntu 8.04 Server でキーボードマップを変更する »

コメント

IPV6_V6ONLYはVista以降はあるみたい
http://msdn.microsoft.com/en-us/library/ms738574(VS.85).aspx

あと
http://www.ipv6style.jp/jp/apps/20030711/index.shtml
によると
「INADDR_ANY を使用せず、getaddrinfo 関数の第1パラメータにNULLを セットし、第3パラメータの addrinfo 構造体のai_flags に AI_PASSIVE をセットするか、in6addr_any 構造体を使用する」
と言う話があるのでその辺を踏まえてソース読んでみると良いんじゃなかろか

投稿: havana | 2008/05/31 13時00分

>>> socket.getaddrinfo(None, 80, socket.AF_INET6, socket.SOCK_STREAM)
[(23, 1, 0, '', ('::1', 80, 0, 0))]
>>> info = socket.getaddrinfo(None, 80, socket.AF_INET6, socket.SOCK_STREAM)
>>> s = socket.socket(*info[0][:3])
>>> s

>>> s.bind(info[0][4])
>>> s.listen
>

>netstat -p TCPv6 -a

Active Connections

Proto Local Address Foreign Address State
TCP x22:http x22:0 LISTENING 0

何となく動いていそう?ipv6全く解ってないけど。

投稿: havana | 2008/05/31 13時35分

何か間違えてた

>>> info = socket.getaddrinfo(None, 80, socket.AF_INET6,socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
>>> info
[(23, 1, 0, '', ('::', 80, 0, 0))]
>>> s = socket.socket(*info[0][:3])
>>> s.bind(info[0][4])
>>> s.listen(1)

投稿: havana | 2008/05/31 13時44分

いつも情報ありがとう。
windows でも ANY Address に bind できました。

投稿: Fomalhaut | 2008/06/02 11時00分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/103108/41324290

この記事へのトラックバック一覧です: [ 備忘録 / Python ] IPv6 any address:

« [ F# ] F# 1.9.4.17 released | トップページ | [ 備忘録 / ubuntu ] Ubuntu 8.04 Server でキーボードマップを変更する »