gpt4 book ai didi

C++ HTTP GET 请求问题?

转载 作者:可可西里 更新时间:2023-11-01 02:35:24 25 4
gpt4 key购买 nike

我编写了一个程序,可以将 tcp 请求发送到命令行中指定的网址并打印响应。当我向 www.google.co.uk(或任何网站)发送 thisget 请求时,我什么也得不到:(

有人可以告诉我我做错了什么,以及对谷歌的正确 GET 请求应该是什么样子。这是代码...

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

int main(int argc, char *argv[]){

WSADATA wsaData;
int iResult;

//Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if(iResult != 0){
printf("WSAStartup failed: %d\n", iResult);
return 1;
}

struct addrinfo *result = NULL,
*ptr = NULL,
hints;

ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

#define DEFAULT_PORT "80"

//Resolve the server address and port
iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
if(iResult != 0){
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return 1;
}

SOCKET ConnectSocket = INVALID_SOCKET;

//Attempt to connect to the first address returned by
//the call to getaddrinfo
ptr = result;

//Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
ptr->ai_protocol);

if(ConnectSocket == INVALID_SOCKET){
printf("Error at socket(): %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}

//Connect to server
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if(iResult == SOCKET_ERROR){
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
}

//Should really try the next address returned by getaddrinfo
//if the connect call failed
//But for this simple example we just free the resources
//returned by getaddrinfo and print an error message

freeaddrinfo(result);

if(ConnectSocket == INVALID_SOCKET){
printf("Unable to connect to server!\n");
WSACleanup();
return 1;
}

#define DEFAULT_BUFLEN 512

int recvbuflen = DEFAULT_BUFLEN;

char *sendbuf = "GET /index.html HTTP/1.1\r\n";
char recvbuf[DEFAULT_BUFLEN];

//Send an initial buffer
iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
if(iResult == SOCKET_ERROR){
printf("send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}

printf("Bytes Sent: %ld\n", iResult);

//shutdown the connection for sending since no more data will be sent
//the client can still use the ConenctSocket for receiving data
iResult = shutdown(ConnectSocket, SD_SEND);
if(iResult == SOCKET_ERROR){
printf("shutdown failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}

do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if(iResult > 0){
printf("Bytes received: %d\n", iResult);
printf(recvbuf);
printf("\n\n");
} else if(iResult == 0){
printf("Connection closed\n");
} else {
printf("recv failed: %d\n", WSAGetLastError());
}
} while(iResult > 0);

//cleanup
closesocket(ConnectSocket);
WSACleanup();

return 0;
}

提前致谢。

最佳答案

一个可能的原因是服务器在发送响应之前需要更多数据。

char *sendbuf = "GET /index.html HTTP/1.1\r\n";

应该是这样

char *sendbuf = "GET /index.html HTTP/1.1\r\n\r\n";

这样您就可以告诉服务器不要期望更多的 HTTP header (每个 header 后跟一个 \r\n 然后一个额外的 \r\n 添加到结束请求)。

基本上,您的 HTTP 请求是不完整的。必须至少提供一个 header (Host)。请注意,服务器可能(错误地)无论如何接受和不完整的请求。如果您想从简单开始,请复制浏览器发送的请求(例如,打开网络调试器并查看传出的网络请求)。

关于C++ HTTP GET 请求问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11417505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com