TCPServer — send and recieve simultaneous

Discussion in 'Ruby' started by Benedikt Mueller, Jul 11, 2009.

  1. Benedikt Mueller, Jul 11, 2009
    #1
    1. Advertising

  2. Benedikt Mueller

    Roger Pack Guest

    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
    --
    Posted via http://www.ruby-forum.com/.
    Roger Pack, Jul 13, 2009
    #2
    1. Advertising

  3. 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.
    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Jul 13, 2009
    #3
  4. Brian Candler 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.
    --
    Posted via http://www.ruby-forum.com/.
    Benedikt Mueller, Jul 13, 2009
    #4
  5. Benedikt Mueller wrote:
    > Brian Candler 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
    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Jul 13, 2009
    #5
  6. 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.
    --
    Posted via http://www.ruby-forum.com/.
    Benedikt Mueller, Jul 13, 2009
    #6
  7. Benedikt Mueller wrote:
    > 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...
    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Jul 13, 2009
    #7
  8. Brian Candler 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 :)
    I thougt I use rescue bla to don't put an error message.
    --
    Posted via http://www.ruby-forum.com/.
    Benedikt Mueller, Jul 13, 2009
    #8
  9. 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
    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Jul 13, 2009
    #9
  10. 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
    --
    Posted via http://www.ruby-forum.com/.
    Benedikt Mueller, Jul 13, 2009
    #10
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Vinay Sajip
    Replies:
    1
    Views:
    362
    Vinay Sajip
    Jul 15, 2008
  2. vicky
    Replies:
    3
    Views:
    1,978
    Brian Cryer
    Nov 22, 2010
  3. Ken Fine
    Replies:
    1
    Views:
    157
    Invotion
    Jan 26, 2004
  4. Julia
    Replies:
    7
    Views:
    226
    Bill Puetz
    Oct 22, 2004
  5. Une Bévue

    TCPServer and IPV6

    Une Bévue, Nov 19, 2012, in forum: Ruby
    Replies:
    0
    Views:
    248
    Une Bévue
    Nov 19, 2012
Loading...

Share This Page