如何在C ++中使用Poco连接安全websocket

时间:2015-11-05 04:28:35

标签: c++ wss poco-libraries

我试图通过使用C ++来连接echo.websocket.org来使用安全的websocket。它适用于https://www.websocket.org/echo.html

的javascript

我的解决方案是使用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 Exception。请问有人帮帮我吗?感谢

2 个答案:

答案 0 :(得分:1)

在测试套件中,test driverconfiguration file提供了http://developer.android.com/reference/android/animation/StateListAnimator.html

关于如何手动完成,它将是这样的:

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);

答案 1 :(得分:0)

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