Weird thing with sockets

First off - i'm a n00b at ruby. This doesn't mean i'm a noob at
programming, but in case i'm about to ask a really stupid question,
sorry in advance :stuck_out_tongue:

With that out of the way, i'm trying to connect to an IP-address
(Specifically an ED2K server) and get information out of it. At first,
simply nothing happened. When i tried to build in a control mechanism,
something weird happened: It told me i was trying to connect to myself!

ยทยทยท

----
Code:

require 'socket'
t = TCPSocket.new('62.241.53.16', '4242')
print "Connecting to " + t.addr[3].to_s + ":" + t.addr[1].to_s
t.recv(100)
print "Closing Connection"
t.close

Result:

Connecting to 192.168.2.6:4182
----

So am i misinterpreting the addr value, or is my program (or possibly
the server i'm trying to connect to) doing some weird things?

Please don't start with "I think you are going in over your head", i
know i am, but for me i think this is the best way to learn Ruby, inside
out...

Thanks in advance!

Gemberkoekje

--
Posted via http://www.ruby-forum.com/.

IIRC:

For the peer's address, you need
t.peeraddr

t.addr is the address of *this* socket "here" (in the system it was
created),
t.peeraddr is the address of the peer socket "there" (the one created to
talk to *this one*)

Pedro

ยทยทยท

--
Pedro Fortuny Ayuso
C/Capuchinos 14, 1. 47006 Valladolid. SPAIN
http://pfortuny.sdf-eu.org

Arie Hofland wrote:

First off - i'm a n00b at ruby. This doesn't mean i'm a noob at
programming, but in case i'm about to ask a really stupid question,
sorry in advance :stuck_out_tongue:

With that out of the way, i'm trying to connect to an IP-address
(Specifically an ED2K server) and get information out of it. At first,
simply nothing happened. When i tried to build in a control mechanism,
something weird happened: It told me i was trying to connect to myself!

----
Code:

require 'socket'
t = TCPSocket.new('62.241.53.16', '4242')
print "Connecting to " + t.addr[3].to_s + ":" + t.addr[1].to_s
t.recv(100)
print "Closing Connection"
t.close

Result:

Connecting to 192.168.2.6:4182
----

So am i misinterpreting the addr value, or is my program (or possibly
the server i'm trying to connect to) doing some weird things?

You are misinterpreting: addr is your own address. After all you *know* the other address already - otherwise you would not have been able to connect.

Another small hint: preferably use the block form whenever possible:

require 'socket'

TCPSocket.open('62.241.53.16', 4242) do |t|
   p t.addr
   p t.recv(100)
   puts "Closing Connection"
end

You can use t.getpeername to obtain a struct sockaddr which you need to unpack to get at the family, address and port of the remote machine:

irb(main):045:0> t=TCPSocket.open('62.241.53.16', 4242)
=> #<TCPSocket:0x3883a8>
irb(main):046:0> t.getpeername
=> "\002\000\020\222>\3615\020\000\000\000\000\000\000\000\000"
irb(main):047:0> t.getpeername.unpack "S"
=> [2]
irb(main):048:0> t.getpeername.unpack "nnC4"
=> [512, 4242, 62, 241, 53, 16]

irb(main):064:0> fam, port, *addr = t.getpeername.unpack "nnC4"
=> [512, 4242, 62, 241, 53, 16]
irb(main):065:0> fam
=> 512
irb(main):066:0> port
=> 4242
irb(main):067:0> addr
=> [62, 241, 53, 16]
irb(main):070:0> addr.join '.'
=> "62.241.53.16"

HTH

Kind regards

  robert

Thank you, i was afraid it was something silly like that.

I'll try some and another things myself, see if i can make another
server 'talk', cause i'm not getting anything yet out of this one.

ยทยทยท

--
Posted via http://www.ruby-forum.com/.

Thanks to both of you, i know much more already now...

And i actually got a reply from the server, after sending a space!

["AF_INET", 4242, "62.241.53.16", "62.241.53.16"]
"\343!\000\000\0008\036\000WARNING : This server is full."
Closing Connection
Press ENTER to close the window...

Alright, not really the kind of reply i was hoping for, but hey :wink:

Thanks to all involved, and more hints are always appreciated (Although
finding out myself has it's merits too :P)

ยทยทยท

--
Posted via http://www.ruby-forum.com/.