PRB: WSACancelAsyncRequest Causes a Memory Access Violation (140166)
The information in this article applies to:
- Microsoft Win32 Software Development Kit (SDK) 3.51
- Microsoft Win32 Software Development Kit (SDK) 4.0
This article was previously published under Q140166 SYMPTOMS
An application that uses the WinSock 1.1 call WSACancelAsyncRequest
occasionally throws memory exceptions or causes erratic behavior.
CAUSE
WSACancelAsyncRequest has unavoidable timing conflicts that make canceling
calls in progress impossible. WSACancelAsyncRequest is only successful at
stopping calls queued for processing that have not yet started.
RESOLUTION
Don't use WSACancelAsyncRequest to cancel calls that may be in progress.
Specifically, don't try to cancel asynchronous selects. Allow them to
complete, and ignore the results if necessary.
STATUS
This behavior is by design.
MORE INFORMATION
When an asynchronous WinSock call is in progress, it is hard to stop. For
example, an outstanding WSAAsyncSelect call may be in the process of
writing to a buffer your application supplied. The sockets DLL has no way
of terminating a memory copy because of the timing windows generated by
multiple threads. One thread may be in the middle of copying while another
does the cancel.
The best way to cancel asynchronous events is to allow them to complete,
but ignore the results. For WSAAsyncSelect, you might set a status flag,
and when the select message is processed by your window procedure, you can
check the status flag, ignoring the message if the flag is set.
Modification Type: | Major | Last Reviewed: | 3/8/1999 |
---|
Keywords: | kbAPI kbnetwork kbprb kbtshoot KB140166 |
---|
|