Ich versuche, einen IRC-Bot zu erstellen, der eine Verbindung zu mehreren Servern herstellt, und ich habe Probleme, von allen Sockets gleichzeitig zu lesen.
Mein aktueller Code:
#! / usr / bin / ruby benötigen "Socket" servers = ["irc.chat4all.org "] def connect (Server, Port, Anzahl) Setzt "Verbindung zu # {Server} ..." @socket [count] = TCPSocket.open (Server, Port) say ("NICK link_hub", count) say ("USER link_hub 0 * link_hub", count) read_data (count) Ende def say (msg, count) @socket [count.to_i] .puts msg.to_s Ende def say_channel (msg, count) @socket [count.to_i] .puts ("PRIVMSG #test:" + msg.to_s) Ende def read_data (count) bis @socket [count] .eof? machen msg = @socket [count] .gets setzt msg if msg.match (/ ^ PING: (. *) $ /) say ("PONG # {$ ~ [1]}", count) say ("JOIN #test", count) Nächster Ende if msg.match (/ `test /) say_channel ("Verbindung zu efnet wird hergestellt ...", count) Thread.new { connect ("irc.efnet.nl", 6667, count) } Ende Ende Ende conn = [] count = 0 @socket = [] servers.each do | server | Verbindung herstellen (Server, 6667, Anzahl) count + = 1 Ende
Das Problem ist, wenn ich den Befehl sende"` test ", es verbindet sich mit efnet, aber es liest den anderen Socket nicht mehr, obwohl ich die neue Verbindung in einem Thread starte. Ich möchte nur von beiden Buchsen gleichzeitig lesen. (die Variable "count" ist die Socket-Nummer)
Kann mir jemand weiterhelfen? Sehr geschätzt!
Antworten:
0 für die Antwort № 1Dafür brauchen Sie Parallelität.
pids = []
servers.each do |server|
pids << fork do
connect(server, 6667, count)
count += 1
end
end
pids.each{|pid| Process.wait pid}
Möglicherweise möchten Sie Informationen zu Prozessen, Threads und anderen Themen des Betriebssystems lesen.