TCPServer — send and recieve simultaneous

R

Roger Pack

Benedikt said:
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
 
B

Brian Candler

Benedikt said:
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.
 
B

Benedikt Mueller

Brian said:
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.
 
B

Brian Candler

Benedikt said:
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
 
B

Benedikt Mueller

All 3 tips didn't help :(

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.
 
B

Brian Candler

Benedikt said:
All 3 tips didn't help :(

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...
 
B

Benedikt Mueller

Brian said:
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 :)
I thougt I use rescue bla to don't put an error message.
 
B

Brian Candler

Benedikt said:
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
 
B

Benedikt Mueller

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top