2015-11-05 485 views
1

我想通过使用C++连接echo.websocket.org来使用安全websocket。它在javascript中工作https://www.websocket.org/echo.html如何在C++中使用Poco连接安全websocket

我的解决方案是使用Poco库,我的代码如下所示。

Poco::Net::initializeSSL(); 

Poco::Net::Context context(Poco::Net::Context::CLIENT_USE, "", "", "", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 

Poco::Net::HTTPSClientSession Client("echo.websocket.org", 443, &context); 
//SSL Exception on above line 

Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/?encoding=text", Poco::Net::HTTPMessage::HTTP_1_1); 
request.set("origin", "https://www.websocket.org"); 
Poco::Net::HTTPResponse response; 

try 
{ 
    Poco::Net::WebSocket webSocket(Client, request, response); 

    std::string str = "Hello!"; 

    char receiveBuff[256]; 

    int len = webSocket.sendFrame(str.data(), str.size(), Poco::Net::WebSocket::FRAME_TEXT); 
    std::cout << "Sent bytes " << len << std::endl; 
    int flags = 0; 

    int rlen = webSocket.receiveFrame(receiveBuff, 256, flags); 
    std::cout << "Received bytes " << rlen << std::endl; 
    std::cout << receiveBuff << std::endl; 

    webSocket.close(); 
} 
catch (std::exception &e) 
{ 
    std::cout << "Exception " << e.what(); 
} 

但我用此代码获得SSL异常。有人可以帮我吗?谢谢

+0

为什么不一样,提供有关“SSL例外”一些更多的信息。并不是说我在那个特定领域拥有专业知识,但是当我看到它时,我可以认识到类型“我的车钥匙不起作用”的问题。比如,它是不是正确的汽车? –

+0

感谢您的澄清。 无论如何,我找到了一个解决方案。这是一个测试套件在https://github.com/pocoproject/poco/tree/develop/NetSSL_OpenSSL/testsuite 但另一个问题是,我无法弄清楚它是如何工作的。 例如,我认为pem文件用于认证,但我不知道如何去做。 –

回答

0

在测试套件中,它是test driver,它为您提供,从configuration file

至于如何做手工,它会是这样:

class MyInvalidCertificateHandler: public InvalidCertificateHandler 
{ 
public: 
    MyInvalidCertificateHandler(bool handleOnServerSide): 
     InvalidCertificateHandler(handleOnServerSide) { } 

    virtual ~MyInvalidCertificateHandler() { } 

    void onInvalidCertificate(const void*, VerificationErrorArgs& errorCert) 
    { 
     //log or something 
     errorCert.setIgnoreError(false); 
    } 
}; 

std::string certFilename = "my/cert/filename"; // path to file 
SharedPtr<InvalidCertificateHandler> ptrCert = new MyInvalidCertificateHandler(false); 
Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", certFilename, VERIFY_STRICT, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
SSLManager::instance().initializeClient(0, ptrCert, ptrContext);