[#11357] [PATCH] an analogue of `long long' — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

18 messages 2000/11/01
[#11358] Re: [PATCH] an analogue of `long long' — matz@... (Yukihiro Matsumoto) 2000/11/01

まつもと ゆきひろです

[#11364] Re: [PATCH] an analogue of `long long' — EGUCHI Osamu <eguchi@...> 2000/11/02

えぐち@エスアンドイー です。

[#11440] class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...>

[ruby-dev:11428] からの続きですが、threadは切りました。

14 messages 2000/11/08
[#11442] Re: class Character (was: Ruby I18N) — TAKAHASHI Masayoshi <maki@...> 2000/11/08

高橋征義です。用語について。

[#11443] Re: class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...> 2000/11/08

At Wed, 8 Nov 2000 20:44:55 +0900,

[#11520] A problem of Socket methods on Windows — OKA Toshiyuki <oka@...>

岡と申します。

22 messages 2000/11/15
[#11523] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11528] Re: A problem of Socket methods on Windows — matz@... (Yukihiro Matsumoto) 2000/11/15

まつもと ゆきひろです

[#11532] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11534] Re: A problem of Socket methods on Windows — OKA Toshiyuki <oka@...> 2000/11/15

岡です。

[#11535] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11538] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11662] IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org>

In article <E140cR3-0002ls-00@ev.netlab.zetabits.co.jp>,

22 messages 2000/11/28
[#11663] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/11/28

まつもと ゆきひろです

[#11664] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/28

In article <E140fxW-0002u9-00@ev.netlab.zetabits.co.jp>,

[#11665] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/28

In article <hvor93w5wb8.fsf@coulee.m17n.org>,

[#11669] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/29

In article <hvoofz05uwz.fsf@coulee.m17n.org>,

[#11672] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/11/29

まつもと ゆきひろです

[#11675] Re: IO (Re: fork problem?) — Koji Arai <JCA02266@...> 2000/11/30

新井です。

[#11677] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/12/01

まつもと ゆきひろです

[ruby-dev:11520] A problem of Socket methods on Windows

From: OKA Toshiyuki <oka@...>
Date: 2000-11-15 00:18:19 UTC
List: ruby-dev #11520
岡と申します。

Windows版Ruby (mingwおよびmswin) で、Socket を利用したサーバーを
作ろうとして気づいたのですが、Socket::open によって作成されたソケ
ットに対して、bind, connect, listen, getsockopt, setsockopt を
実行しようとすると、

irb(main):001:0> require 'socket'
true
irb(main):002:0> s = Socket.open(Socket::AF_INET, Socket::SOCK_STREAM, 0)
#<Socket:0x2afd948>
irb(main):003:0> a =  [Socket::AF_INET, 9876, 0, ""].pack("snNa8")
"\002\000&\224\000\000\000\000\000\000\000\000\000\000\000\000"
irb(main):004:0> s.bind(a)
Errno::E10038: ソケット以外のものに対して操作を実行しようとしました。 - "bind(2)"

というようなエラーになります。

win32.c を調べてみると、これらのメソッドの下請けである mybind など、
myxxxx という関数が、渡ってきた SOCKET 引数をそのまま使って、
Winsock の xxxx を呼んでいるのが原因のようです。

mybind には、TCPServer::open の内部から呼ばれるときは、生のソケッ
トハンドルがそのまま渡されますが、Socket#bind からは、rb_fdopen
(Winの場合は、_open_osfhandle) によって関連付けされた別のハンドル
が渡ってきます。

ということで、渡ってきた SOCKET引数が、本当にソケットハンドルかど
うかを確認してやればよかろう、と考え、添付のようなパッチを当てま
した。当方のビルド環境 (VC6 + SP4) では、うまく動いているようです。
--
岡 俊行 (OKA, Toshiyuki) oka@langedge.com


---- 以下、パッチ ----
--- win32.c.orig	Wed Sep 27 16:36:35 2000
+++ win32.c	Wed Nov 15 01:08:21 2000
@@ -2013,8 +2013,15 @@
     if (!NtSocketsInitialized++) {
 	StartSockets();
     }
-    if ((r = bind (s, addr, addrlen)) == SOCKET_ERROR)
+    if ((r = bind (s, addr, addrlen)) == SOCKET_ERROR) {
 	errno = WSAGetLastError();
+	if (errno == WSAENOTSOCK) {
+	    if ((s = TO_SOCKET(s)) >= 0) {
+		if ((r = bind (s, addr, addrlen)) == SOCKET_ERROR)
+		    errno = WSAGetLastError();
+	    }	    
+	}
+    }
     return r;
 }
 
@@ -2027,8 +2034,15 @@
     if (!NtSocketsInitialized++) {
 	StartSockets();
     }
-    if ((r = connect (s, addr, addrlen)) == SOCKET_ERROR)
+    if ((r = connect (s, addr, addrlen)) == SOCKET_ERROR) {
 	errno = WSAGetLastError();
+	if (errno == WSAENOTSOCK) {
+	    if ((s = TO_SOCKET(s)) >= 0) {
+		if ((r = connect (s, addr, addrlen)) == SOCKET_ERROR)
+		    errno = WSAGetLastError();
+	    }	    
+	}
+    }
     return r;
 }
 
@@ -2070,8 +2084,15 @@
     if (!NtSocketsInitialized++) {
 	StartSockets();
     }
-    if ((r = getsockopt (s, level, optname, optval, optlen)) == SOCKET_ERROR)
+    if ((r = getsockopt (s, level, optname, optval, optlen)) == SOCKET_ERROR) {
 	errno = WSAGetLastError();
+	if (errno == WSAENOTSOCK) {
+	    if ((s = TO_SOCKET(s)) >= 0) {
+		if ((r = getsockopt (s, level, optname, optval, optlen)) == SOCKET_ERROR)
+		    errno = WSAGetLastError();
+	    }	    
+	}
+    }
     return r;
 }
 
@@ -2098,8 +2119,15 @@
     if (!NtSocketsInitialized++) {
 	StartSockets();
     }
-    if ((r = listen (s, backlog)) == SOCKET_ERROR)
+    if ((r = listen (s, backlog)) == SOCKET_ERROR) {
 	errno = WSAGetLastError();
+	if (errno == WSAENOTSOCK) {
+	    if ((s = TO_SOCKET(s)) >= 0) {
+		if ((r = listen (s, backlog)) == SOCKET_ERROR)
+		    errno = WSAGetLastError();
+	    }	    
+	}
+    }
     return r;
 }
 
@@ -2171,8 +2199,15 @@
 	StartSockets();
     }
     if ((r = setsockopt (s, level, optname, optval, optlen))
-    		 == SOCKET_ERROR)
+    		 == SOCKET_ERROR) {
 	errno = WSAGetLastError();
+	if (errno == WSAENOTSOCK) {
+	    if ((s = TO_SOCKET(s)) >= 0) {
+		if ((r = setsockopt (s, level, optname, optval, optlen)) == SOCKET_ERROR)
+		    errno = WSAGetLastError();
+	    }	    
+	}
+    }
     return r;
 }
     
---- ここまで ----

In This Thread

Prev Next