Article ID: 140527 - Last Review: November 21, 2006 - Revision: 4.1 "Assertion failed - <app name>:File sockcore.cpp" error message when you use a multi-threaded application that uses MFC's socket classesThis article was previously published under Q140527 On This PageSYMPTOMS A multi-threaded application that uses MFC's socket classes
encounters a message box or debug output line that contains an error message
similar to the following: For Visual C++ 2.x:
Assertion failed - <app name>:File sockcore.cpp, Line 837 Assertion failed - <app name>:File
sockcore.cpp, Line 1041 CAUSE Most frequently, this problem is due to the sharing of
CSocket objects between multiple threads. A CSocket object should be used only in the context of a single thread because the SOCKET handle encapsulated by a CAsyncSocket object is stored in a per-thread handle map. (CSocket is derived from CAsyncSocket.) Other information is stored on a per-thread basis, including a hidden notification window that MFC uses for socket notifications. The assertion failure line, which can be found in Sockcore.cpp in the \Msvc20\Mfc\Src directory, is: RESOLUTION As already mentioned, a CAsyncSocket object should be used
only in the context of a single thread. If you need to switch the thread that
is accessing a SOCKET connection with another thread, then you should use a
separate CAsyncSocket object in each thread, and use the Detach and Attach
functions to attach the CAsyncSocket object to the SOCKET handle in the thread
that is about to use the socket. Use this sequence:
Note One concern often arises that socket notification messages might be lost between the time the call to Detach() is made and the subsequent call to Attach() is made. This is not a concern because of the way socket notifications are handled. The implementation of CAsyncSocket::Attach() makes a call to WSAAsyncSelect to enable notifications. As mentioned in the documentation for WSAAsyncSelect, if any socket notifications were already pending for the SOCKET, they will be re-posted. MORE INFORMATION To Accept a socket in the context of one thread and then
begin using it in the context of another thread, you need to be sure to detach
the CAsyncSocket object in the first thread and attach a different CAsyncSocket
object in the second thread. The following code snippet shows how to do it. Code sampleREFERENCES MFC Technical Note #2 - Although this technical note does
not directly address the CAsyncSocket class, it does discuss the mapping of
handles to objects. The relationship between a SOCKET handle and a CAsyncSocket
object is maintained in much the same way. APPLIES TO
| Article Translations
|
Back to the top
