From: Brian Candler Date: 2007-08-14T18:07:01+09:00 Subject: UDP sockets raise exception on MIPS platform I am running ruby-1.8.6 under OpenWrt (*), which is a small MIPS platform (4MB flash, 16MB RAM) running linux-2.4.34 and uClibc. Everything seems to work fine apart from UDP sockets. As soon as you try to read using 'recvfrom', an exception is raised: root@OpenWrt:~# irb irb(main):001:0> require 'socket' => true irb(main):002:0> s = UDPSocket.new => # irb(main):003:0> s.bind("0.0.0.0",1234) => 0 irb(main):004:0> d = s.recvfrom(512) IOError: recv for buffered IO from (irb):4:in `recvfrom' from (irb):4 irb(main):005:0> But strangely, TCP sockets work just fine. Now, the only place I can see this exception raised is here in etc/socket/socket.c: if (rb_read_pending(fptr->f)) { rb_raise(rb_eIOError, "recv for buffered IO"); } If I modify the READ_DATA_PENDING macro in io.c so it is always zero, then this problem goes away. However, TCP sockets are then broken :-( In any case, I don't understand at all what this rb_read_pending call is doing, so I don't feel comfortable simply removing this check for recvfrom. Does anyone have any suggestions as to the problem, or where I should look further? Thanks, Brian. (*) http://www.openwrt.org/ I am using the brcm-2.4 flavour of OpenWrt Kamikaze 7.07 Almost no patching is required to make Ruby cross-compile under OpenWrt. See https://dev.openwrt.org/browser/packages/lang/ruby