Network:socket发送http请求

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值