ruby非ブロックsocketプログラミング--飛信クライアントの経験の総括を書く


最近rubyを使用して飛信クライアントを記述する際、TCPSocketのブロック問題に遭遇し、socketは常に直接停止またはタイムアウトに失敗している.探索を経て、次の方法は非常に効果的で、やっとメールを送ることができました.

require "socket"

class SIPC
	def initialize(sipc_addr)
		puts sipc_addr #uri = "221.176.31.33:8080"
		uri = sipc_addr.split(":")
		@socket = TCPSocket.new(uri[0], uri[1].to_i)
	end

	# send SIP-C request
	def request(sip_request)
		puts sip_request
		@socket.write_nonblock(sip_request)
		#@socket.write(sip_request) also works

		#select,read_nonblock and rescue is the key
		IO.select [@socket]
		res = ""
		begin
			while chunk = @socket.read_nonblock(4096)
				res = res + chunk
			end
		rescue
		end
		puts res 
		return res 
	end
end