小田@QNES です。 --- On Thu, 23 Dec 1999 20:01:49 +0900 [[ruby-list:19861] Re: [mswin32] TCPSocket::new() raises Errno::ENOENT] Katsuyuki Komatsu <komatsu / sarion.co.jp> wrote: > 小松です。 > closesocket()は必ず呼ぶ必要があるようなので、fclose()を置き換える > という手を試してみました。 fclose した後に closesocket すると例外しませんか? それで悩んでfcloseだけにしたような記憶が... fclose get_osfhandle closesocket の順で行うと、get_osfhandle で bad handle が返るのですが closesocket はエラーにもなりませんし、一見上手くいきます。 ですが、exit 処理の中で socket の cleanup 処理をしようとして invalid handle で例外します(;_;) もう少し考えてみないといけませんね。 ハンドルリークのチェックって、どうされているんでしょうか? よろしかったら教えていただけませんか? # タスクマネージャでしょうか? > これで、一応ハンドルリークはなくなったようなのですが、fclose()を > 置き換えるよりrubyio.hのstruct OpenFileにソケットかどうかのフラグ > を立てて、そちらで条件判定する方がいいかも。 fclose を置き換えてしまうと、File I/O 全般に影響が出そうな 気がします。 以下のパッチで myfdclose 中でfclose(=myfdclose?)を呼んでますが 大丈夫ですか? この場合どうなるんでしょうか? 単純に考えると再帰しそうですが、上手くいくんでしょうか? >
> --- win32/win32.c.dist Mon Nov 8 12:57:01 1999 > +++ win32/win32.c Thu Dec 23 19:05:24 1999 > @@ -312,4 +312,28 @@ myget_osfhandle(int fh) > } > > +#undef fclose > + > +int > +myfdclose(FILE *fp) > +{ > + char sockbuf[80]; > + int fd; > + int optlen; > + int retval; > + > + fd = get_osfhandle(fileno(fp)); > + optlen = sizeof(sockbuf); > + retval = getsockopt((SOCKET)fd, SOL_SOCKET, SO_TYPE, sockbuf, &optlen); > + if (retval == SOCKET_ERROR) { > + int iRet; > + > + iRet = WSAGetLastError(); > + if (iRet == WSAENOTSOCK || iRet == WSANOTINITIALISED) > + return fclose(fp); > + } > + retval = fclose(fp); > + closesocket(fd); > + return retval; > +} > > FILE * > @@ -1656,12 +1680,4 @@ myfdopen (int fd, const char *mode) > return _fdopen(fh, mode); // return file pointer > } > - > - > -void > -myfdclose(FILE *fp) > -{ > - fclose(fp); > -} > - >
> // > --- win32/win32.h.dist Fri Aug 13 14:45:20 1999 > +++ win32/win32.h Thu Dec 23 19:02:13 1999 > @@ -172,5 +172,5 @@ extern int mypclose(FILE *); > extern int flock(int fd, int oper); > extern FILE * myfdopen(int, const char *); > -extern void myfdclose(FILE *); > +extern int myfdclose(FILE *); > extern SOCKET myaccept(SOCKET, struct sockaddr *, int *); > extern int mybind(SOCKET, struct sockaddr *, int); > @@ -263,4 +263,9 @@ extern char *mystrerror(int); > #endif > #define fdopen myfdopen > + > +#ifdef fclose > +#undef fclose > +#endif > +#define fclose myfdclose > > #ifdef accept > > -- > 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp> > ∪*****/\*****\/*****/\*****∪ Koji Oda NEC Software Kyusyu 1st Development Department Based Software Division E-Mail:oda / bsd1.qnes.nec.co.jp ∩*****/\*****\/*****/\*****∩