0

我有一个需要使用 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 事件。

4

1 回答 1

0

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

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

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

于 2017-11-18T20:10:57.277 回答