From: Shigeo Kobayashi Date: 2000-06-28T16:25:03+09:00 Subject: [ruby-list:23581] Re:[mswin32] Ctrl-C while socket operation (Re: Ruby 1.4.5) 小林です。 ----- Original Message ----- From: "Katsuyuki Komatsu" Subject: [ruby-list:23576] [mswin32] Ctrl-C while socket operation (Re: Ruby 1.4.5) > > tsvr.rbでもそうなのですが、mswin32ではソケットの関係の操作を > しているときにCtrl-Cを押してもうまく止まらないという問題が > 残っています。 > (snip) > > 2. clnt.rb接続後にCtrl-Cを押すと、clnt.rbで入力するか、別のclnt.rbが > 接続するまで止まらない。 > > C:\lang\ruby>ruby tsvr.rb > server is on 2449 > # is accepted ← "is accepted"が出たらCtrl-Cを押す > tsvr.rb:13:in `accept': Interrupt ← clnt.rbでなにか入力して改行を入れる か > from tsvr.rb:13 別なclnt.rbから接続にいかないと > 止まらない > C:\lang\ruby> > これって、accept()等をブロッキングモード で実行しているからなのでしょうか? 前に同様な問題を経験したことがあります。 これから出張したり何かと余裕がないので、 ruby上で確かめるのは後回しということで... 以下のようなコードで間に合わせた記憶が あります。 unsigned long ulCmdArg = 1; // Force to non-blocking I/O. ioctlsocket(hServer,FIONBIO,&ulCmdArg); Retry: // Wait till connection from a client hClient = accept(hServer,NULL,NULL);  if(hClient==INVALID_SOCKET) { if(WSAGetLastError()==WOULDBLOCK) goto Retry; goto ERROR; } 小林茂雄 shigeo@tinyforest.gr.jp