MSVC ++中用于本地主机的TLS客户端:端口

我有一个本地服务器,该服务器的REST API运行在https://localhost:61000上,可以向其发送以下Curl请求:

curl -X POST "https://localhost:61000/users/logout" -H "accept: */*" -H "Locale: en"

它将返回以下响应

MSVC ++中用于本地主机的TLS客户端:端口

在使用WinSockOpenSSL库的MSVC ++中,我可以从200的端口google.com获取响应代码443,但是当我尝试使用本地主机时在端口61000上,我总是得到一个HTTP/1.1 400 Bad Request

// Client

int main(int argc,char* argv[])
{
    WSADATA wsadata;
    if ((WSAStartup(MAKEWORD(2,0),&wsadata)) == 0) {
        cout << "-WSAStartup Initialized." << endl;
        struct addrinfo hints,* res;
        int sockfd;

        memset(&hints,sizeof hints);
        hints.ai_socktype = 0;// SOCK_STREAM;
        hints.ai_protocol = 0;// IPPROTO_TCP;
        hints.ai_family = AF_UNSPEC;

        if (getaddrinfo("localhost","61000",&hints,&res) != 0) {
            cout << "-getaddrinfo unsuccessful." << WSAGetLastError() << endl;
        }

        if ((sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == INVALID_SOCKET) {
            cout << "-Unable to create socket." << WSAGetLastError() << endl;
        }

        if ((connect(sockfd,res->ai_addr,res->ai_addrlen)) != SOCKET_ERROR) {
            cout << "-Connection Established." << endl;
        }

        cout << "-Client connected to: " << res->ai_addr << endl;

        SSL_library_init();
        SSLeay_add_ssl_algorithms();
        SSL_load_error_strings();

        const SSL_METHOD* meth = TLSv1_2_client_method();
        SSL_CTX* ctx = SSL_CTX_new(meth);

        ssl = SSL_new(ctx);
        if (!ssl) {
            printf("Error creating SSL.\n");
            log_ssl();
            return -1;
        }
        sock = SSL_get_fd(ssl);
        SSL_set_fd(ssl,sockfd);
        int err = SSL_connect(ssl);
        if (err <= 0) {
            printf("Error creating SSL connection.  err=%x\n",err);
            log_ssl();
            fflush(stdout);
            return -1;
        }
        printf("SSL connection using %s\n",SSL_get_cipher(ssl));

        const char* request = "GET /users HTTPS/1.1\r\n\r\n";
     //SendPacket
        int len = SSL_write(ssl,request,strlen(request));
        if (len < 0) {
            int err = SSL_get_error(ssl,len);
            switch (err) {
            case SSL_ERROR_WANT_WRITE:
                return 0;
            case SSL_ERROR_WANT_READ:
                return 0;
            case SSL_ERROR_ZERO_RETURN:
            case SSL_ERROR_SYSCALL:
            case SSL_ERROR_SSL:
            default:
                return -1;
            }
        }

        //RecvPacket
        len = 100;
        char buf[20000];
        do {
            len = SSL_read(ssl,buf,100);
            buf[len] = 0;
            printf(buf);
        } while (len > 0);
        if (len < 0) {
            int err = SSL_get_error(ssl,len);
            if (err == SSL_ERROR_WANT_READ)
                return 0;
            if (err == SSL_ERROR_WANT_WRITE)
                return 0;
            if (err == SSL_ERROR_ZERO_RETURN || err == SSL_ERROR_SYSCALL || err == SSL_ERROR_SSL)
                return -1;
        }
    }
    else {
        cout << "-WSAStartup Initialization failed." << endl;
        if (WSACleanup() != 0) {
            cout << "-WSACleanup Successful." << endl;
        }
        else {
            cout << "-WSACleanup Failed." << endl;
        }
    }
    return 0;
}

响应:

MSVC ++中用于本地主机的TLS客户端:端口

假设(HTTP)400错误的请求响应状态代码指示服务器由于某些被视为客户端错误的原因而无法或不会处理该请求,但是我不知道如何在以下位置创建该请求正确的方法。

lk38264945 回答:MSVC ++中用于本地主机的TLS客户端:端口

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3152121.html

大家都在问