[#38080] ポートが閉じているときの例外など — Mitsuru Ogino <ogino@...>

荻野と申します。いつも質問や要望ばかりですみません。

36 messages 2003/08/11
[#38086] Re: ポートが閉じているときの例外など — nobu.nakada@... 2003/08/12

なかだです。

[#38088] Re: ポートが閉じているときの例外など — IWAOKA Masahiro <iwaoka@...> 2003/08/12

いわおかです。

[#38091] Re: ポートが閉じているときの例外など — Mitsuru Ogino <ogino@...> 2003/08/12

荻野です。

[#38092] Re: ポートが閉じているときの例外など — nobu.nakada@... 2003/08/12

なかだです。

[#38093] Re: ポートが閉じているときの例外など — IWAOKA Masahiro <iwaoka@...> 2003/08/12

いわおかです。

[#38095] Re: ポートが閉じているときの例外など — Takahiro Kambe <taca@...> 2003/08/12

In message <20030812150516.GV37221@barber.fe.rn.tuat.ac.jp>

[#38102] Re: ポートが閉じているときの例外など — Tetsuo NAKAGAWA <tet@...> 2003/08/14

中川と申します。

[#38121] Re: ポートが閉じているときの例外など — Takahiro Kambe <taca@...> 2003/08/15

In message <20030814.140757.707824131.tetsuo@sapphire.siz.nes.nec.co.jp>

[#38123] Re: ポートが閉じているときの例外など — nobu.nakada@... 2003/08/16

なかだです。

[#38130] Re: ポートが閉じているときの例外など — Takahiro Kambe <taca@...> 2003/08/16

In message <200308160517.h7G5HcPL012839@sharui.nakada.kanuma.tochigi.jp>

[#38137] Re: ポートが閉じているときの例外など — nobu.nakada@... 2003/08/18

なかだです。

[#38139] Re: ポートが閉じているときの例外など — Takahiro Kambe <taca@...> 2003/08/18

In message <200308180959.h7I9xnb7001977@sharui.nakada.kanuma.tochigi.jp>

[#38122] ruby-tcpwrap and mkmf.rb — Takahiro Kambe <taca@...>

こんにちは。

16 messages 2003/08/16
[#38125] Re: ruby-tcpwrap and mkmf.rb — "Akinori MUSHA" <knu@...> 2003/08/16

At Sat, 16 Aug 2003 12:51:55 +0900,

[#38183] String << の動作につきまして — kuto@...

うと と申します。

44 messages 2003/08/22
[#38187] Re: String << の動作につきまして — Take_tk <ggb03124@...> 2003/08/22

たけ(tk)です。

[#38189] Re: String << の動作につきまして — Tadayoshi Funaba <tadf@...5.so-net.ne.jp> 2003/08/23

ふなばです。

[#38190] Re: String << の動作につきまして — Take_tk <ggb03124@...> 2003/08/23

たけ(tk)です。

[#38191] Re: String << の動作につきまして — Tadayoshi Funaba <tadf@...5.so-net.ne.jp> 2003/08/23

ふなばです。

[#38194] Re: String << の動作につきまして — Take_tk <ggb03124@...> 2003/08/23

たけ(tk)です。

[#38196] Re: String << の動作につきまして — Tadayoshi Funaba <tadf@...5.so-net.ne.jp> 2003/08/23

ふなばです。

[#38203] Re: String << の動作につきまして — 西 啓一朗 <receiver@...> 2003/08/23

ども、西啓一朗@Ktouth Brand. です。

[#38208] Re: String << の動作につきまして — Tadayoshi Funaba <tadf@...5.so-net.ne.jp> 2003/08/23

ふなばです。

[#38211] Re: String << の動作につきまして — 西 啓一朗 <receiver@...> 2003/08/24

ども、西啓一朗@Ktouth Brand. です。

[#38195] 理解の進め方(Re: String << の動作につきまして) — Tadashi Oh-Ya <toy@...>

おおやです。

36 messages 2003/08/23
[#38206] 理解の進め方:シュールな世界 — Take_tk <ggb03124@...> 2003/08/23

たけ(tk)です。

[#38233] シュールな名前 — Take_tk <ggb03124@...> 2003/08/25

たけ(tk)です

[#38198] Tmailで送るメールに日付がつけられなくなりました — 川田誠司 <kawada.seiji@...>

はじめまして

11 messages 2003/08/23

[#38256] かみ砕いた説明をすべき範囲 — 西 啓一朗 <receiver@...>

ども。西啓一朗@Ktouth Brand. です。

41 messages 2003/08/26
[#38258] Re: かみ砕いた説明をすべき範囲 — nobu.nakada@... 2003/08/26

なかだです。

[#38261] Re: かみ砕いた説明をすべき範囲 — Take_tk <ggb03124@...> 2003/08/26

たけ(tk)です

[#38262] Re: かみ砕いた説明をすべき範囲 — nobu.nakada@... 2003/08/26

なかだです。

[#38264] Re: かみ砕いた説明をすべき範囲 — Take_tk <ggb03124@...> 2003/08/26

たけ(tk)です

[#38265] Re: かみ砕いた説明をすべき範囲 — IWAOKA Masahiro <iwaoka@...> 2003/08/26

いわおかです。

[#38267] Re: かみ砕いた説明をすべき範囲 — Take_tk <ggb03124@...> 2003/08/26

たけ(tk)です

[#38273] Re: かみ砕いた説明をすべき範囲 — matz@... (Yukihiro Matsumoto) 2003/08/26

まつもと ゆきひろです

[ruby-list:38152] Re: ポートが閉じているときの例外など

From: nobu.nakada@...
Date: 2003-08-19 05:13:30 UTC
List: ruby-list #38152
なかだです。

At Tue, 19 Aug 2003 01:44:54 +0900,
Takahiro Kambe wrote:
> LAN上のホストを相手にすると、EINPROGRESSの場合にgetsockopt(2)でチェッ
> クしない場合は、
> 
> 1. connect()失敗 (EINPROGRESS)
> 2. connect()失敗 (EINVAL)
> 3. getsockopt()で ECONNREFUSED を検知
> 
> となります。
> 
> CPUが高速、メモリやハードディスクがいっぱいになっても、システムコール
> にかかるオーバーヘッドは、(システムコールの呼び出しを伴わない)ライブラ
> リに比べるとはるかに大きいものです。必要のないシステムコールの呼び出し
> をやめることができることができれば、それに越したことはありません。

1の時点でECONNREFUSEDが分かっていない場合には、いわおかさんの例
([ruby-list:38142])のように、逆にgetsockopt()が無駄になるように
思えますが。

EALREADYを別にすればいい?

> > 対応としては、FreeBSD(*BSD全部?)でもWAIT_IN_PROGRESSを有効にす
> > るということでいいんでしょうか。全システムで有効にしたほうがい
> > いのかな?
> 以下の環境の確認はできました。
> 
> 	NetBSD 1.6 and current
> 	FreeBSD 2.2.8
> 	OpenBSD 3.3

それぞれ、__NetBSD__, __FreeBSD__, __OpenBSD__でいいでしょうか。


Index: ext/socket/socket.c
===================================================================
RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v
retrieving revision 1.99
diff -u -2 -p -r1.99 socket.c
--- ext/socket/socket.c	1 Aug 2003 07:02:54 -0000	1.99
+++ ext/socket/socket.c	19 Aug 2003 05:10:21 -0000
@@ -732,4 +732,7 @@ thread_write_select(fd)
 #define WAIT_IN_PROGRESS 10
 #endif
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#define WAIT_IN_PROGRESS 1
+#endif
 
 static int
@@ -744,4 +747,5 @@ ruby_connect(fd, sockaddr, len, socks)
 #ifdef WAIT_IN_PROGRESS
     int wait_in_progress = -1;
+    int sockerr, sockerrlen = sizeof(sockerr);
 #endif
 
@@ -780,4 +784,13 @@ ruby_connect(fd, sockaddr, len, socks)
 	      case EINPROGRESS:
 #endif
+#ifdef WAIT_IN_PROGRESS
+		status = getsockopt(fd, SOL_SOCKET, SO_ERROR, &sockerr, &sockerrlen);
+		if (status) break;
+		if (sockerr) {
+		    status = -1;
+		    errno = sockerr;
+		    break;
+		}
+#endif
 #ifdef EALREADY
 	      case EALREADY:
@@ -792,6 +805,4 @@ ruby_connect(fd, sockaddr, len, socks)
 	      case EINVAL:
 		if (wait_in_progress-- > 0) {
-		    int sockerr, sockerrlen = sizeof(sockerr);
-
 		    /*
 		     * connect() after EINPROGRESS returns EINVAL on


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread