MetaNest あねっくす このページをアンテナに追加 RSSフィード

平和でなく▽静かではある
生きて行くうちに▽出会ったとしたら▽こんな時間帯を▽信じてはならぬ
「赤々丸」(内田 美奈子)拾伍・平和でなく静かであり より
Squipper ( http://metanest.jp/squipper/squipper.xhtml ) のサンプルに使う画像を募集しています。詳細はリンク先を
「彁」の用例をもしご存知のかた、おられましたらご一報を(コメント欄でもなんでもいいです)

プロフィール

はてなアイデア提案中。よろしく
i:21132 i:22380
1970 | 01 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
2008 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 |
2016 | 07 | 10 |

2010/Jun/28(月) 2010/Jun/28(月)

Ruby で IPv4 IPv6 に両対応した TCP サーバの書き方 select を使わない篇

16:22 | Ruby で IPv4 IPv6 に両対応した TCP サーバの書き方 select を使わない篇を含むブックマーク Ruby で IPv4 IPv6 に両対応した TCP サーバの書き方 select を使わない篇のブックマークコメント

echo サーバのサンプルです

Ruby レシピブック第 2 版には select を使うコードがありますが、OS に、RFC 3493 の§3.7 で示されている IPv4 マッピングの機能があってそれを利用できれば、ひとつのソケットで両方をハンドルできます

システムデフォルトで IPV6_V6ONLY がオフであれば明示的に操作する必要はないのですが、デフォルトがオンのシステムがけっこうあるので、明示的にオフにしています(そのために Socket オブジェクトを使わざるをえません)

ruby 1.8場合、IPPROTO_IPV6 と IPV6_V6ONLY が Ruby の定数になっていないので直接ハードコーディングします

require "socket"

include Socket::Constants

port = 12345

server_socket = Socket.new PF_INET6, SOCK_STREAM, 0
server_socket.setsockopt 41, 27, false  # 41 = IPPROTO_IPV6, 27 = IPV6_V6ONLY
server_socket.bind Socket.pack_sockaddr_in port, "::"
server_socket.listen 5
loop {
	Thread.fork(server_socket.accept){|sock_addr|
		sock = sock_addr[0]
		addr = sock_addr[1]
		print "client = "
		p Socket.unpack_sockaddr_in addr
		begin
			while buf = sock.gets do
				sock.write buf
				sock.flush
			end
		ensure
			unless sock.closed? then
				sock.close
			end
		end
	}
}

以下は ruby 1.9 用。定数 IPPROTO_IPV6 と IPV6_V6ONLY が使えます

require "socket"

include Socket::Constants

port = 12345

server_socket = Socket.new PF_INET6, SOCK_STREAM, 0
server_socket.setsockopt IPPROTO_IPV6, IPV6_V6ONLY, false
server_socket.bind Socket.pack_sockaddr_in port, "::"
server_socket.listen 5
loop {
	Thread.fork(server_socket.accept){|sock_addr|
		sock = sock_addr[0]
		addr = sock_addr[1]
		print "client = "
		p Socket.unpack_sockaddr_in addr
		begin
			while buf = sock.gets do
				sock.write buf
				sock.flush
			end
		ensure
			unless sock.closed? then
				sock.close
			end
		end
	}
}
トラックバック - http://d.hatena.ne.jp/metanest/20100628