I now understand this error and why I was getting it. Your handler for "sniffer.connect" returns a Sniffer object, which is not a legal return value for XML-RPC. You could use a combination of Config::ENABLE_MARSHALLING and XMLRPC::Marshallable to get Ruby's implementation to dump it, but that doesn't seem to be what you wanted here.
I added a simple:
true
to the end of all of your handlers and then the server and client ran for me.
Here are the total changes I made. First, the server:
#!/usr/bin/env ruby -wKU
require 'xmlrpc/server'
class Sniffer
def initialize(port, ip)
@port = port
@ip = ip
end
def start
# Use the pcap library to sniff at port @port from ip @ip
# ...
puts "Started sniffing..."
end
def stop
# Stop the sniffer
# ...
puts "Stopped sniffing..."
end
end
s = XMLRPC::Server.new(8080)
sniffer = nil
s.add_handler("sniffing.connect") do |port, ip|
sniffer = Sniffer.new(port, ip)
true
end
s.add_handler("sniffing.start") do
sniffer.start if sniffer
true
end
s.add_handler("sniffing.stop") do
sniffer.stop if sniffer
true
end
s.serve
__END__
And here is my client:
#!/usr/bin/env ruby -wKU
require 'xmlrpc/client'
server = XMLRPC::Client.new("localhost", "/RPC2", 8080)
server.call("sniffing.connect", 25000, "192.168.10.10")
Thread.new {
server.call_async("sniffing.start")
}
# Now sending network traffic
# ...
sleep 2
server.call("sniffing.stop")
__END__
Will these scripts run for you now, as is?
James Edward Gray II
···
On Nov 15, 2007, at 9:22 PM, James Edward Gray II wrote:
In method start of class sniffer, I actually use a while loop until the sender stop the sendingstream.
I have sat over here fiddling with this thing half the night and I can't seem to get that far. When I run your server and client I get a type error for the arguments. I see this on error the client:
/usr/local/lib/ruby/1.8/xmlrpc/client.rb:546:in `do_rpc': HTTP-Error: 500 Internal Server Error (RuntimeError)
from /usr/local/lib/ruby/1.8/xmlrpc/client.rb:420:in `call2'
from /usr/local/lib/ruby/1.8/xmlrpc/client.rb:410:in `call'
from client.rb:6
And the server reports:
[2007-11-15 21:15:20] ERROR RuntimeError: Wrong type!
/usr/local/lib/ruby/1.8/xmlrpc/create.rb:274:in `conv2value'
/usr/local/lib/ruby/1.8/xmlrpc/create.rb:148:in `methodResponse'
/usr/local/lib/ruby/1.8/xmlrpc/create.rb:147:in `collect'
/usr/local/lib/ruby/1.8/xmlrpc/create.rb:147:in `methodResponse'
/usr/local/lib/ruby/1.8/xmlrpc/server.rb:378:in `handle'
/usr/local/lib/ruby/1.8/xmlrpc/server.rb:310:in `process'
/usr/local/lib/ruby/1.8/xmlrpc/server.rb:760:in `service'
/usr/local/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/usr/local/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/usr/local/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/usr/local/lib/ruby/1.8/webrick/server.rb:95:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:92:in `each'
/usr/local/lib/ruby/1.8/webrick/server.rb:92:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:23:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:82:in `start'
/usr/local/lib/ruby/1.8/xmlrpc/server.rb:648:in `serve'
server.rb:37
localhost - - [15/Nov/2007:21:15:20 CST] "POST /RPC2 HTTP/1.1" 500 292
- -> /RPC2
I haven't figured this out yet, but I'm still trying. I'll get it eventually.