2013-04-13 4 views
0

여러 대의 서버에 연결하는 IRC 봇을 만들려고하고 있으며 모든 소켓을 한꺼번에 읽는 데 문제가 있습니다.Ruby - 여러 소켓에서 읽기 (irc bot)

내 현재 코드 :

 

    #!/usr/bin/ruby 
    require 'socket' 

    servers = ["irc.chat4all.org"] 

    def connect(server, port, count) 
      puts "connecting to #{server}..." 
        @socket[count] = TCPSocket.open(server, port) 
        say("NICK link_hub", count) 
        say("USER link_hub 0 * link_hub", count) 
        read_data(count) 
    end 

    def say(msg, count) 
      @socket[count.to_i].puts msg.to_s 
    end 

    def say_channel(msg, count) 
      @socket[count.to_i].puts("PRIVMSG #test :"+msg.to_s) 
    end 


    def read_data(count) 
      until @socket[count].eof? do 
        msg = @socket[count].gets 
        puts msg 
        if msg.match(/^PING :(.*)$/) 
          say("PONG #{$~[1]}", count) 
          say("JOIN #test", count) 
          next 
        end 
        if msg.match(/`test/) 
          say_channel("connecting to efnet...", count) 
          Thread.new { 
          connect("irc.efnet.nl", 6667, count) 
          } 
        end 
      end 
    end 

    conn = [] 
    count = 0 
    @socket = [] 
    servers.each do |server| 
      connect(server, 6667, count) 
      count += 1 
    end 

문제는 내가 명령 ''테스트 '를 보낼 때, 그것은 efnet에 연결하지만 늘 메신저의 새로운 연결을 실행하더라도 더 이상 다른 소켓을 읽을 수 있다는 것입니다 실. 두 소켓에서 동시에 읽으려고합니다. (변수 'count'는 소켓 번호입니다.)

아무도 도와 줄 수 있습니까? 매우 감사!

답변

0

당신은 그것에 대해 평행 관계가 필요합니다.

pids = [] 
servers.each do |server| 
    pids << fork do 
     connect(server, 6667, count) 
     count += 1 
    end 
end 
pids.each{|pid| Process.wait pid} 

프로세스, 스레드 및 기타 운영 체제 항목을 읽는 것이 좋습니다.