CAsyncSocket::OnReceive 未在 DLL 中调用

Posted

技术标签:

【中文标题】CAsyncSocket::OnReceive 未在 DLL 中调用【英文标题】:CAsyncSocket::OnReceive not being called in DLL 【发布时间】:2017-11-15 16:49:31 【问题描述】:

我有一个需要使用 VC++ CAsyncSocket 进行 TCP 连接的 Qt 程序。我创建了一个dll。包装 CAsyncSocket。

class CClientSocket ;
class __declspec(dllexport) CClientSocketEx

public:
    CClientSocketEx();
     ~CClientSocketEx();

     void Close();
     bool Create();
     bool Connect(const char* lpszHostAddress, unsigned int nHostPort); 
     int Send(const char* lpBuf, int nBufLen, int nFlags = 0);
     bool GetPeerName(char* rPeerAddress, int length, unsigned int& rPeerPort);
     int Receive(void* lpBuf, int nBufLen, int nFlags = 0);
private:
    CClientSocket* clientSocket;
;

class CClientSocket : public CAsyncSocket

   virtual void OnReceive(int nErrorCode);
;

void CClientSocket::OnReceive(int nErrorCode)

    if (!AfxSocketInit())
    
        AfxMessageBox(_T("Failed to Initialize Sockets"), MB_OK | MB_ICONSTOP);
    
    CString mesage(_T("CClientSocket::OnReceive nErrorCode: %d"), nErrorCode);
    logMessage(mesage);
    CAsyncSocket::OnReceive(nErrorCode);

我遇到的问题是 CAsyncSocket::OnRecieve 是 从来没有打电话。

此外,如果我在不等待 OnRecieve 的情况下调用 CAsyncSocke::Recieve,我会收到 WSAEWOULDBLOCK 错误。

当我在自己的 PC 上进行单元测试时,一切正常。当我在客户端机器上尝试时,我遇到了上述问题。连接和发送命令一切正常,我被告知硬件正在发送回复,但没有 OnRecieve 事件。

【问题讨论】:

【参考方案1】:

在 DLL 中发送 OnRecieve 消息似乎有问题。

尽管没有发送 OnRecieve 消息,但 Recieve 仍应可以读取任何响应。

因此,如果在 DLL 中使用 CAsyncSocket,似乎一种解决方法是不使用 CAsyncSocket::OnRecieve,而只使用 CAsyncSocket::Receive。也许附加到一个计时器上。

【讨论】:

以上是关于CAsyncSocket::OnReceive 未在 DLL 中调用的主要内容,如果未能解决你的问题,请参考以下文章

未找到配置文件:未找到未过期的配置文件

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

未处理的拒绝 SequelizeEagerLoadingError:未关联,并且无法读取未定义的属性“getTableName”

未捕获的 ReferenceError:未定义 ytcfg(也未定义 __ytRIL)