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