Ticket #575 (closed defect: fixed)

Opened 10 years ago

Last modified 10 years ago

Unregistering from Windows IOCompletionPort (IOCP) ioqueue does not close the socket handle (thanks Gang Liu for the report)

Reported by: bennylp Owned by: bennylp
Priority: major Milestone: release-1.0-rc1
Component: pjlib Version: trunk
Keywords: Cc:
Backport to 1.x milestone: Backported:

Description (last modified by bennylp) (diff)

The IOCP documentation says that application needs to call CloseHandle() to unregister the socket from the IOCP, and PJLIB does this in ioqueue_winnt.c.

We assumed that a call to CloseHandle() should close the socket (just like closesocket()), since a socket should just be another handle in Windows NT.

But turns out this is not the case. A call to CloseHandle() doesn't seem to close the socket, as the socket still appears in "netstat" output. Also further down it will cause "Invalid handle" exception to be raised in debug mode when WSACleanup() is called.

Checking at MSDN documentation about CloseHandle() (see http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx), actually it does suggest application to call both for socket, i.e. always follow closesocket() call with CloseHandle(). This is what it says:

After closing a socket using the closesocket function, ensure that you release the socket by calling CloseHandle. For more information, see Socket Closure.

But alas! From experimentation, turns out that calling CloseHandle() after closesocket() will raise "Invalid handle" exception in debug mode. This was tested on WinXP SP2.

Change History

comment:1 Changed 10 years ago by bennylp

  • Priority changed from normal to major
  • Status changed from new to closed
  • Resolution set to fixed
  • Description modified (diff)

Fixed in r2155. Now we just use closesocket() to replace CloseHandle() to unregister socket from IOCP.

Tested on WinXP SP2.

Note: See TracTickets for help on using tickets.