2017-11-15 24 views
0

TCP 연결에 VC++ CAsyncSocket을 사용해야하는 Qt 프로그램이 있습니다. 나는 dll을 만들었습니다. CAsyncSocket을 래핑합니다.DLL에서 CAsyncSocket :: OnReceive가 호출되지 않습니다.

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 오류가 발생합니다.

내 컴퓨터에서 단위 테스트를하면 모든 것이 정상적으로 작동합니다. 클라이언트 컴퓨터에서 시도 할 때 위의 문제가 있습니다. connect 및 send 명령은 모두 정상적으로 작동하며 하드웨어가 응답을 보냈지 만 OnRecieve 이벤트는 보내지 않는다는 것을 알립니다.

답변

0

DLL에서 OnRecieve 메시지를 보내는 데 문제가있는 것 같습니다.

OnRecieve 메시지를 보내지 않았음에도 불구하고 모든 응답을 Recieve에서 읽을 수 있어야합니다.

따라서 DLL에서 CAsyncSocket을 사용하면 CAsyncSocket :: OnRecieve를 사용하지 않고 CAsyncSocket :: Receive 만 사용하는 것이 좋습니다. 아마도 타이머에 붙어 있습니다.