On Mon, Dec 27, 2004 at 08:52:01AM +0900, Michael Fuhr wrote:
> Roeland Moors <roelandmoors / telenet.be> writes:
> 
> > require 'socket'
> > sock = Socket.new(Socket::PF_UNIX, Socket::SOCK_STREAM, 0)
> > sock.connect(Socket::sockaddr_un(device))
> > sock.puts('VERSION')
> > sock.close
> >
> > This works sometimes, but sometimes it don't and then I get this
> > error:
> > test.rb:4:in `write': Broken pipe (Errno::EPIPE)
> >         from test.rb:4:in `puts'
> >         from test.rb:4
> 
> A write fails with EPIPE if the peer has already closed its side
> of the connection.
> 

It looks more like the connection isn't ready yet. Is this
possible?
Reading works just fine, but that's probably because it has to
wait for input.

> > I can get it to work always if i put 'sleep 0.1' after
> > connecting. But way do I have to do this. Is there a better
> > method?
> 
> Using sleep to synchronize activities should be a warning that
> something is wrong; if it works then it's more likely by accident
> than by design.
> 
> What's on the other end of the connection?  If the peer closes its
> side before you call puts() then you'll get EPIPE.  It's odd that
> sleeping for 0.1 seconds apparently fixes the problem; I'd have to
> think about it to see if I could contrive a situation where that
> would happen.
> 

I'm trying to send a command to a device created by lirc:
http://www.lirc.org/html/technical.html#applications

> What OS are you using?  
OS:
    Debian sarge
uname -a:
    Linux server 2.6.8 #1 Mon Sep 6 20:57:44 CEST 2004 i686 GNU/Linux
ruby --version:
    ruby 1.8.2 (2004-12-06) [i386-linux]

> Have you run a process trace on the peer
> to see what it does after it accepts your connection?
> 
Could you explain this a bit more?
Or point me to some documentation on how to do this?


-- 
Roeland