#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
#include <string>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
bool parse_url(string &url_string, string &host_string, string &resource_string)
{
const char *url = strstr(url_string.c_str(), "http://");
if (url == nullptr)
url = url_string.c_str();
else
url = url + strlen("http://");
char host[MAXBYTE] = { 0 }, resource[MAXBYTE] = { 0 };
sscanf_s(url, "%[^/]%s", host, MAXBYTE, resource, MAXBYTE);
host_string = host;
if (strlen(resource) != 0)
resource_string = resource;
else
resource_string = "/";
return true;
}
int main()
{
WSADATA wsaData = { 0 };
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf("Win sock load failed\n");
return -1;
}
string url = "http://news.baidu.com/";
string host, rest;
hostent *host_info;
if (!parse_url(url, host, rest))
return -1;
string request = "GET " + rest + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";;
host_info = gethostbyname(host.c_str());
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
server_addr.sin_addr = *(in_addr*)host_info->h_addr;
connect(server_socket, (SOCKADDR*)&server_addr, sizeof(server_addr));
if (SOCKET_ERROR == send(server_socket, request.c_str(), request.length(), 0))
{
cout << "send failed. Error code: " << WSAGetLastError() << endl;
return -1;
}
int RECV_UNIT = 1024 * 1024, RECV_SIZE = 1024 * 1024;
char *recv_buffer = (char *)malloc(RECV_UNIT);
ZeroMemory(recv_buffer, RECV_UNIT);
int has_read = 0, recv_len = 1;
FILE *file = fopen("test.html", "w");
while (recv_len > 0)
{
recv_len = recv(server_socket, recv_buffer + has_read, RECV_SIZE - has_read, 0);
if (recv_len)
has_read += recv_len;
if (RECV_UNIT - has_read < 100)
{
RECV_SIZE += RECV_UNIT;
recv_buffer = (char*)realloc(recv_buffer, RECV_SIZE);
}
}
//cout << recv_buffer << endl;
printf("fetch %s...\n", url.c_str());
fprintf(file, "%s", recv_buffer);
printf("fetch done!\n");
free(recv_buffer);
fclose(file);
WSACleanup();
return 0;
}
Network:socket发送http请求
最新推荐文章于 2022-05-16 01:24:33 发布