mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 a8c748d277
			
		
	
	
		a8c748d277
		
	
	
	
	
		
			
			a patch from Kazuhiro NISHIYAMA <zn at mbf.nifty.com>. [ruby-dev:30713] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12184 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # simple httpd
 | |
| 
 | |
| # The code demonstrates how a multi-protocol daemon should be written.
 | |
| 
 | |
| require "socket"
 | |
| require "thread"
 | |
| 
 | |
| port = 8888
 | |
| res = Socket.getaddrinfo(nil, port, nil, Socket::SOCK_STREAM, nil, Socket::AI_PASSIVE)
 | |
| sockpool = []
 | |
| names = []
 | |
| threads = []
 | |
| 
 | |
| res.each do |i|
 | |
|   s = TCPserver.new(i[3], i[1])
 | |
|   n = Socket.getnameinfo(s.getsockname, Socket::NI_NUMERICHOST|Socket::NI_NUMERICSERV).join(" port ")
 | |
|   sockpool.push s
 | |
|   names.push n
 | |
| end
 | |
| 
 | |
| (0 .. sockpool.size - 1).each do |i|
 | |
|   mysock = sockpool[i]
 | |
|   myname = names[i]
 | |
|   STDERR.print "socket #{mysock} started, address #{myname}\n"
 | |
|   threads[i] = Thread.start do		# Thread.start cannot be used here!
 | |
|     ls = mysock	# copy to dynamic variable
 | |
|     t = Thread.current
 | |
|     STDERR.print "socket #{myname} listener started, pid #{$$} thread #{t}\n"
 | |
|     while true
 | |
|       as = ls.accept
 | |
|       Thread.start do
 | |
| 	STDERR.print "socket #{myname} accepted, thread ", Thread.current, "\n"
 | |
| 	s = as	# copy to dynamic variable
 | |
| 	str = ''
 | |
| 	while line = s.gets
 | |
| 	  break if line == "\r\n" or line == "\n"
 | |
| 	  str << line
 | |
| 	end
 | |
| 	STDERR.print "socket #{myname} got string\n"
 | |
| 	s.write("HTTP/1.0 200 OK\n")
 | |
| 	s.write("Content-type: text/plain\n\n")
 | |
| 	s.write("this is test: my name is #{myname}, you sent:\n")
 | |
| 	s.write("---start\n")
 | |
| 	s.write(str)
 | |
| 	s.write("---end\n")
 | |
| 	s.close
 | |
| 	STDERR.print "socket #{myname} processed, thread ", Thread.current, " terminating\n"
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| for t in threads
 | |
|   t.join
 | |
| end
 |