【问题标题】:400 bad request error when send a GET http request by using winsock library使用 winsock 库发送 GET http 请求时出现 400 bad request 错误
【发布时间】:2019-06-01 23:12:21
【问题描述】:

我正在尝试向网络服务器发送 GET 请求(例如:www.coursera.org,...)。但是sServer返回一个响应头:HTTP/1.1 400 bad request

我在 C++ 中使用 Winsock 并建立一个套接字连接到服务器。然后,向服务器发送 GET 请求。

int main(void) {

    get_Website("www.coursera.org");

    cout << website_HTML;

    cout << "\n\nPress ANY key to close.\n\n";
    cin.ignore(); cin.get();


    return 0;
}


void get_Website(string url) 
{

    WSADATA wsaData;
    SOCKET Socket;
    SOCKADDR_IN SockAddr;
    int lineCount = 0;
    int rowCount = 0;
    struct hostent* localHost;
    string srequete;
    char* localIP;


    srequete = "GET / HTTP/1.0\r\n";
    srequete += "Host: www.coursera.org\r\n";
    srequete += "Connection: close\r\n\r\n";

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        cout << "WSAStartup failed.\n";
        system("pause");
        //return 1;
    }

    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    localHost = gethostbyname(url.c_str());
    localIP = inet_ntoa(*(struct in_addr *)*localHost->h_addr_list);
    SockAddr.sin_port = htons(443);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = inet_addr(localIP);

    if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) {
        cout << "Could not connect";
        system("pause");
        //return 1;
    }
    send(Socket, srequete.c_str(), strlen(srequete.c_str()), 0);

    int nDataLength;
    while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0) {
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            website_HTML += buffer[i];
            i += 1;
        }
    }

    closesocket(Socket);
    WSACleanup();

}

问题似乎是 GET 请求错误?

【问题讨论】:

    标签: c++ sockets http winsock


    【解决方案1】:

    他们无法解析您的请求,因为您试图将其发送到未加密的 https 端口 (443)。您可以尝试向它发送 http 端口 (80),但无论如何他们都会将您重定向到 https://coursera.org

    【讨论】:

    • 我发送到端口(80)并收到错误“301 永久移动”。我认为当网站有 http 协议和端口 443 用于 https 协议时使用端口 80。
    • 是的,没错。换句话说,他们告诉你他们不支持 HTTP,只支持 HTTPS。因此,要使用它们,您需要在应用程序中支持 HTTPS。
    • 是的。我刚刚意识到这一点。使用端口 80 时,该代码适用于 HTTP 网站。但是对于 HTTPS,它不是!谢谢!
    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2021-08-29
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多