> On Wed, Apr 20, 2011 at 7:17 PM, Bastien ROUCARIES > <roucaries.bast...@gmail.com> wrote: > >> Is the gnulib select() only intended to be used with nonblocking sockets on > >> windows? > > > > I have just tested the program at the end of the file, it thread is > > blocked when enable =0 (block socket) and enable=1 it fail with > > WSAEWOULDBLOCK > > > > So i possible stragegy will be: > > 1. createathread TID from parent > > 2. in TID do WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE,NULL, 0, NULL, > > 0,&bytes,NULL,NULL); > > 3. in parent: if TID returned with WSAEWOULDBLOCK tag socket non blocking > > 4. query running state of TID, if suspended socket is blocking, kill > > thread and mark socket blocking > > It will not work using a thread (thread are not cancelable under > windows), but using a new process with inherited socket it will work > slow but a little bit as the projected openat function using fork >
Hi, thanks for your replies guys. Bastien, The problem with sending io control codes is there will likely be unintended consequences if used as you theorize. From what I've seen so far there is no way to determine the blocking state without sending a control code, or in other words, actually making the request. If the socket is blocking then it will block. If blocking, killing the thread that's waiting on the event you'd be killing the waiting not the pending operation, although I haven't tested that so I can't say for certain. api monitor shows: Either SIO_ADDRESS_LIST_CHANGE or SIO_ROUTING_INTERFACE_CHANGE will result in ntdeviceiocontrol(socket, event, ... If the socket is nonblocking the immediate return is STATUS_DEVICE_NOT_READY. If it is blocking then the immediate return is STATUS_PENDING and wsaioctl waits for a signal which is set when the operation completes. I think for now I will submit code for Wget that will disable NBIO immediately after rpl_select() returns or instead use ms select() with FD_TO_SOCKET. Thanks, Jay