[#11357] [PATCH] an analogue of `long long' — "Nobuyoshi.Nakada" <nobu.nakada@...>
なかだです。
まつもと ゆきひろです
えぐち@エスアンドイー です。
まつもと ゆきひろです
えぐち@エスアンドイー です。
まつもと ゆきひろです
>From: matz@zetabits.com (Yukihiro Matsumoto)
まつもと ゆきひろです
[#11440] class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...>
[ruby-dev:11428] からの続きですが、threadは切りました。
高橋征義です。用語について。
At Wed, 8 Nov 2000 20:44:55 +0900,
高橋征義です。
At Thu, 9 Nov 2000 13:30:34 +0900,
まつもと ゆきひろです
[#11447] gets は secure? — Kazuhiro NISHIYAMA <zn@...>
出力がInsecureなのに入力はsecureなのでしょうか?
[#11467] debug write in regex.c? — "Nobuyoshi.Nakada" <nobu.nakada@...>
なかだです。
[#11500] rb_to_integer/rb_to_int — "Nobuyoshi.Nakada" <nobu.nakada@...>
なかだです。
[#11520] A problem of Socket methods on Windows — OKA Toshiyuki <oka@...>
岡と申します。
なかだです。
まつもと ゆきひろです
なかだです。
岡です。
なかだです。
なかだです。
岡です。
なかだです。
[#11569] blocking on socket? — Shugo Maeda <shugo@...>
前田です。
[#11591] object.c パッチ — Kazuhiro NISHIYAMA <zn@...>
使われてなかったnil_plusの削除とOBJ_INFECTへの変更です。
[#11611] return value of waitpid2 — Koji Arai <JCA02266@...>
新井です。
まつもと ゆきひろです
荒井です。いや、新井です。(よくあることさ)
まつもと ゆきひろです
新井です。
新井です。
[#11618] Re: class variable — "Koji Arai" <jca02266@...>
新井です
なかだです。
まつもと ゆきひろです
> まつもと ゆきひろです
まつもと ゆきひろです
まつもと ゆきひろです
新井です。
[#11641] eval too slow — Wakou Aoyama <wakou@...>
青山です。
[#11650] conflict of NODE_DREGX_ONCE — "Nobuyoshi.Nakada" <nobu.nakada@...>
なかだです。
まつもと ゆきひろです
[#11662] IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org>
In article <E140cR3-0002ls-00@ev.netlab.zetabits.co.jp>,
まつもと ゆきひろです
In article <E140fxW-0002u9-00@ev.netlab.zetabits.co.jp>,
In article <hvor93w5wb8.fsf@coulee.m17n.org>,
In article <hvoofz05uwz.fsf@coulee.m17n.org>,
まつもと ゆきひろです
新井です。
まつもと ゆきひろです
In article <E141eaC-0003w0-00@ev.netlab.zetabits.co.jp>,
まつもと ゆきひろです
In article <E142ZqF-0004rX-00@ev.netlab.zetabits.co.jp>,
まつもと ゆきひろです
In article <E143Zem-000271-00@ev.netlab.zetabits.co.jp>,
まつもと ゆきひろです
In article <E143amj-00028V-00@ev.netlab.zetabits.co.jp>,
[ruby-dev:11520] A problem of Socket methods on Windows
岡と申します。
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;
}
---- ここまで ----