-
Notifications
You must be signed in to change notification settings - Fork 20
Description
Hi,
I am looking into how to implement a Whois client using Net::TCPClient.
However I am a bit stuck, because I can't work out how to read an arbitrary number of bytes.
The Whois protocol involves:
- Opening a TCP socket
- Sending the request string
- Reading all the bytes returned until the socket is closed
I guess it is quite similar to very basic HTTP.
If I try reading a large number of bytes, like this:
Net::TCPClient.connect(server: 'whois.nic.me:43') do |client|
client.write("DOMAIN njh.me\r\n")
response = client.read(4096)
puts "Received: #{response}"
end
Then I get an error:
/Users/njh/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/net_tcp_client-2.2.0/lib/net/tcp_client/tcp_client.rb:651:in `socket_read': Connection lost while reading data (Net::TCPClient::ConnectionFailure)
Because the server closed the connection before the client received the full 4096 bytes. But if I set the read size, to a low number (for example 100), then I only get back those 100 bytes.
I have considered having a loop reading a small number of bytes at a time, but I can't see how to avoid the Net::TCPClient::ConnectionFailure
error, given that I don't know how many bytes the server is going to send.
The reason for using Net::TCPClient
at all and not just a plain TCPSocket
, is because I want to try each of the IP addresses in DNS in turn and not just fail if the first chosen IP address is down.
Any help would be very appreciated.