【发布时间】:2011-04-30 05:40:30
【问题描述】:
我有一个 COM 组件,用 C++ 和 ATL 实现,它使用重叠的套接字 I/O。与服务器建立连接后,它立即开始对套接字进行重叠读取,代码如下:
// Pass pointer to this instance as hEvent parameter, for use by callback
m_recvOverlapped.hEvent = reinterpret_cast<HANDLE>(this);
int rc = ::WSARecv(m_s, &wsabuf, 1, &m_recvNumberOfBytes, &m_recvFlags, &m_recvOverlapped, RecvCallback);
if (rc == SOCKET_ERROR)
{
// If error is WSA_IO_PENDING, then the I/O is still in progress. Otherwise, something bad happened.
int error = ::WSAGetLastError();
if (error != WSA_IO_PENDING)
{
ReceiveError(error);
}
}
我有一个看起来像这样的回调函数:
void CALLBACK CMySocket::RecvCallback(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags)
{
CMySocket* socket = reinterpret_cast<CMySocket*>(lpOverlapped->hEvent);
ATLASSERT(socket != 0);
if (!socket)
return;
socket->ReceiveCompleted(dwError, cbTransferred, lpOverlapped, dwFlags);
}
此 COM 组件在单元测试中、在命令行应用程序中使用时以及在 .NET GUI 应用程序中使用时(通过 COM 互操作)都可以正常工作。但是,当我在 MFC 应用程序中使用此组件时,RecvCallback 在服务器向其发送数据时永远不会被调用。
WSARecv() 返回SOCKET_ERROR,WSAGetLastError() 返回WSA_IO_PENDING,正如异步重叠读取所预期的那样。
当我使用 SysInternals TcpView 应用程序观察正在发生的事情时,它表明客户端正在接收数据。但是回调永远不会被调用。
通过连接的套接字向服务器发送数据可以正常工作。
我在我的 MFC 应用程序的 InitInstance() 方法中调用 CoInitializeEx() 和 WSAStartup()。
有什么想法吗?
【问题讨论】:
标签: c++ com mfc winapi winsockets