けいじゅ@日本ラショナルソフトウェアです.
Socket#shutdownの動作がおかしい気がするのですがどうなんでしょう?
結果その1
dim% irb
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400d169c>, #<Socket:0x400d16b0>]
irb0> s1 << "abc\n"
#<Socket:0x400d169c>
irb0> s2.gets
"abc\n"
irb0> s1.shutdown 0
0
irb0> s1.print "abc\n"
nil
irb0> s2.gets
"abc\n"
irb0> s2.print "abc\n"
nil
irb0> s1.gets
"abc\n"
irb0> quit
結果その2-1
dim% irb
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400e8234>, #<Socket:0x400e8248>]
irb0> s1.shutdown 1
0
irb0> s1.print "abc\n"
nil
irb0> s2.gets
"abc\n"
irb0> s2.print "abc\n"
Broken pipe
結果その2-2
dim% irb
use readline module
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400d169c>, #<Socket:0x400d16b0>]
irb0> s1.shutdown 1
0
irb0> s1.gets
nil
結果その3
dim% irb
use readline module
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400d169c>, #<Socket:0x400d16b0>]
irb0> s1.shutdown 2
0
irb0> s2.print "abc\n"
nil
irb0> s1.gets
"abc\n"
irb0> s1 << "def\n"
Broken pipe
結果を見ると分かると思うのですが, s1.shutdown 0 では何も行なわれていま
せん. s1.shutdown 1 では(書き込みはできるが)読み込みができなくなってい
ます. さらに, s1.shutdown 2 では(読み込みはできるが)書き込みができな
くなっています.
そうであるべき動作と1づれています.
ソースを見ても分からなかったのですが...
static VALUE
bsock_shutdown(argc, argv, sock)
int argc;
VALUE *argv;
VALUE sock;
{
VALUE howto;
int how;
OpenFile *fptr;
rb_scan_args(argc, argv, "01", &howto);
if (howto == Qnil)
how = 2;
else {
how = NUM2INT(howto);
===> if (how < 0 && how > 2) how = 2;
}
GetOpenFile(sock, fptr);
if (shutdown(fileno(fptr->f), how) == -1)
rb_sys_fail(0);
return INT2FIX(0);
}
===>のところは少なくとも間違っていると思います.
__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---