TCPServer — send and recieve simultaneous

Hi
I’m trying to make a
sublet(http://unexist.scrapping.cc/projects/subtle/wiki/Sublets) the
title, artist and time from shell-fm. My code:http://sprunge.us/QheF?rb
But I didn’t recieve anything. With puts(“skip”) there is no problem, it
skips the track, so the connection cannot be breaken. Can you help me?

linopolus

Benedikt Mueller wrote:

Hi
I’m trying to make a
sublet(http://unexist.scrapping.cc/projects/subtle/wiki/Sublets) the
title, artist and time from shell-fm. My code:http://sprunge.us/QheF?rb
But I didn’t recieve anything. With puts(“skip”) there is no problem, it
skips the track, so the connection cannot be breaken. Can you help me?

maybe add an
sfm.skip in there
though it shouldn’t be ncessary.
My guess is that somehow you don’t quite have the right format. You
could also try watching your packets with wireshark to see what’s going
on.
Good luck!
=r

Benedikt Mueller wrote:

I’m trying to make a
sublet(http://unexist.scrapping.cc/projects/subtle/wiki/Sublets) the
title, artist and time from shell-fm. My code:http://sprunge.us/QheF?rb
But I didn’t recieve anything. With puts(“skip”) there is no problem, it
skips the track, so the connection cannot be breaken. Can you help me?

No idea what protocol you’re talking to, but in any case don’t use recv
on a TCP socket. Use either read or gets.

sfm.read(100) will wait until exactly 100 bytes has been read, or the
other end has closed the connection.

sfm.gets will wait until a newline has been read, or the other end has
closed the connection.

What exactly you should do depends on the protocol - in particular, how
it marks the end of a reply. Given that the request is terminated by a
newline, it would make sense for the reply to be terminated by newline
too.

Brian C. wrote:

Benedikt Mueller wrote:

I’m trying to make a
sublet(http://unexist.scrapping.cc/projects/subtle/wiki/Sublets) the
title, artist and time from shell-fm. My code:http://sprunge.us/QheF?rb
But I didn’t recieve anything. With puts(“skip”) there is no problem, it
skips the track, so the connection cannot be breaken. Can you help me?

No idea what protocol you’re talking to, but in any case don’t use recv
on a TCP socket. Use either read or gets.

sfm.read(100) will wait until exactly 100 bytes has been read, or the
other end has closed the connection.

sfm.gets will wait until a newline has been read, or the other end has
closed the connection.

What exactly you should do depends on the protocol - in particular, how
it marks the end of a reply. Given that the request is terminated by a
newline, it would make sense for the reply to be terminated by newline
too.
I tried it with sfm.read(100) but it still don’t work. With netcat it
works: echo “info %a : %t - %R” |nc “127.0.0.1” “54311” returns the
title, artist and time.

Benedikt Mueller wrote:

Brian C. wrote:

Benedikt Mueller wrote:

I’m trying to make a
sublet(http://unexist.scrapping.cc/projects/subtle/wiki/Sublets) the
title, artist and time from shell-fm. My code:http://sprunge.us/QheF?rb
But I didn’t recieve anything. With puts(“skip”) there is no problem, it
skips the track, so the connection cannot be breaken. Can you help me?

No idea what protocol you’re talking to, but in any case don’t use recv
on a TCP socket. Use either read or gets.

sfm.read(100) will wait until exactly 100 bytes has been read, or the
other end has closed the connection.

sfm.gets will wait until a newline has been read, or the other end has
closed the connection.

What exactly you should do depends on the protocol - in particular, how
it marks the end of a reply. Given that the request is terminated by a
newline, it would make sense for the reply to be terminated by newline
too.
I tried it with sfm.read(100) but it still don’t work. With netcat it
works: echo “info %a : %t - %R” |nc “127.0.0.1” “54311” returns the
title, artist and time.

I think you probably need sfm.gets.

If that doesn’t work, try reading it byte by byte:

while true
ch = sfm.getc
puts ch.inspect
end

Then you can see whether the problem is that the command is not
generating any response (which means that the problem is in the puts),
or that the response is not terminated in the way you expect.

It is possible, although not common, that the server is waiting for you
to close the connection from your side before it sends a response. If
so, you need to “half close” it:

sfm.puts “some command”
sfm.close_write
result = sfm.read(100)

It’s also possible that the server is expecting the command line to be
terminated with \r\n instead of \n

All 3 tips didn’t help :frowning:

I made it in a standalone script for now:

require ‘socket’
begin
rescue EPIPE
sfm=TCPSocket.open(‘localhost’, 54311)

while line = sfm.read(100)

sfm.puts “info %a : %t - %R\r\n”

sfm.close_write

bla = sfm.read(100)
puts bla
sfm.close
end

I ran it with -r debug and here’s it:

ruby -r debug shellfm.rb
Debug.rb
Emacs support available.

shellfm.rb:1:require ‘socket’
(rdb:1) n
shellfm.rb:2:begin
(rdb:1) n

You can see: It didn’t came until the puts anyway.

Benedikt Mueller wrote:

All 3 tips didn’t help :frowning:

I made it in a standalone script for now:

require ‘socket’
begin
rescue EPIPE
sfm=TCPSocket.open(‘localhost’, 54311)

while line = sfm.read(100)

sfm.puts “info %a : %t - %R\r\n”

sfm.close_write

bla = sfm.read(100)
puts bla
sfm.close
end

That makes no sense. You’ve put all the useful code under a rescue
clause - which means it won’t run until an exception is raised. That
program should simply terminate.

I suggest you use puts bla.inspect instead of puts bla, in case you’re
just getting an empty string back.

In any case, on my machine (Ubuntu), EPIPE does not exist. The constant
is Errno::EPIPE. Are you running on Windows perhaps? While you’re at it,
it would be helpful if you said the exact version of Ruby you’re using
too.

If this is ruby-1.9 and Windows, then I don’t use either…

Brian C. wrote:

That makes no sense. You’ve put all the useful code under a rescue
clause - which means it won’t run until an exception is raised. That
program should simply terminate.
Sry I’m totaly new at ruby :slight_smile:
I thougt I use rescue bla to don’t put an error message.

Benedikt Mueller wrote:

I thougt I use rescue bla to don’t put an error message.

Oh sure, you need it this way round though:

begin
… put the rest of your code here
rescue Errno::EPIPE
end

THX
It works with gets now:
require ‘socket’
sfm=TCPSocket.open(‘localhost’, 54321)
sfm.puts “info %a : %t - %R\n”
puts sfm.gets
sfm.close