2009-11-12 3 views
0

J'essaie de configurer un client et un serveur UDP simple à l'aide de Ruby. Le code ressemble à ceci:Échec du test serveur/client Ruby UDP

require 'socket.so' 

class UDPServer 
    def initialize(port) 
    @port = port 
    end 

    def start 
    @socket = UDPSocket.new 
    @socket.bind(nil, @port) # is nil OK here? 
    while true 
     packet = @socket.recvfrom(1024) 
     puts packet 
    end 
    end 
end 

server = UDPServer.new(4321) 
server.start 

C'est le client:

require 'socket.so' 

class UDPClient 
    def initialize(host, port) 
    @host = host 
    @port = port 
    end 

    def start 
    @socket = UDPSocket.open 
    @socket.connect(@host, @port) 
    while true 
     @socket.send("otiro", 0, @host, @port) 
     sleep 2 
    end 
    end 
end 

client = UDPClient.new("10.10.129.139", 4321) # 10.10.129.139 is the IP of UDP server 
client.start 

Maintenant, j'ai deux machines VirtualBox sous Linux. Ils sont dans le même réseau, ils peuvent se pinguer les uns aux autres.

Mais quand je lance le serveur UDP sur la machine A, et puis essayez d'exécuter le client UDP sur la machine BI obtenir l'erreur suivante:

client.rb:13:in `send': Connection refused - sendto(2) (Errno::ECONNREFUSED) 

Je pense que l'erreur est dans la méthode de liaison sur la serveur. Je ne sais pas quelle adresse je devrais préciser ici. J'ai lu quelque part que vous devriez utiliser l'adresse de votre interface LAN/WAN, mais je ne sais pas comment obtenir cette adresse.

Quelqu'un peut-il me aider avec celui-ci?

Répondre

4

Votre paramètre hôte nil est compris comme localhost, donc une machine externe ne pourra pas se connecter à cette socket. Essayez ceci:

@socket.bind('', @port) # '' ==> INADDR_ANY 

De la documentation pour Socket:

host is a host name or an address string (dotted decimal for IPv4, or a hex string for IPv6) for which to return information. A nil is also allowed, its meaning depends on flags, see below.

....

Socket::AI_PASSIVE: when set, if host is nil the ‘any’ address will be returned, Socket::INADDR_ANY or 0 for IPv4, "0::0" or "::" for IPv6. This address is suitable for use by servers that will bind their socket and do a passive listen, thus the name of the flag. Otherwise the local or loopback address will be returned, this is "127.0.0.1" for IPv4 and "::1’ for IPv6

+0

En utilisant '' ou Socket INADDR_ANY que l'adresse IP pour la méthode de liaison résout le problème. Merci! – StackedCrooked

0

Est-ce que @socket.bind("10.10.129.139", @port) sur le serveur ne fonctionne pas?

Edit:

Habituellement vous pourriez avoir plusieurs interfaces réseau sur une machine (WLAN, LAN, ..). Ils ont tous des adresses IP différentes, vous devez donc lier un serveur à au moins une adresse hôte.

Questions connexes