网络编程——http

在Linux系统中使用C语言实现HTTP客户端或服务器通常涉及使用套接字编程和一些HTTP协议的基本知识。下面是一个简单的示例,展示了如何用C语言实现一个HTTP客户端,向一个HTTP服务器发送请求并接收响应。

  1. HTTP客户端示例 (C语言)

这个例子展示了如何用C语言通过TCP连接到HTTP服务器,发送HTTP请求并打印出响应。(示例为火狐新闻主页面)

代码示例:

cpp 复制代码
#include "public.h"

int init_tcp_cli(const char *ip, unsigned short port)
{
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd < 0)
	{
		perror("fail socket");
		return -1;
	}

	struct sockaddr_in seraddr;

	seraddr.sin_family = AF_INET;
	seraddr.sin_port = htons(port);
	seraddr.sin_addr.s_addr = inet_addr(ip);

	int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
	if (ret < 0)
	{
		perror("fail connect");
		return -1;
	}

	return sockfd;
}

int send_request(int sockfd)
{
	char *pstr = "GET / HTTP/1.1\r\n"
				 "Host: news.sohu.com\r\n"
				 "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n"
				 "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n"
				 "Accept-Language: en-US,en;q=0.5\r\n"
				 "Connection: close\r\n\r\n";

	ssize_t size = send(sockfd, pstr, strlen(pstr), 0);
	if (size < 0)
	{
		perror("fail send");
		return -1;
	}

	return 0;
}

int recv_response(int sockfd)
{
	char buff[1024] = {0};

	while (1)
	{
		memset(buff, 0, sizeof(buff));
		ssize_t size = recv(sockfd, buff, sizeof(buff), 0);
		if (size < 0)
		{
			perror("fail recv");
			return -1;
		}
		if (0 == size)
		{
			break;
		}
		
		write(1, buff, size);
	}
	
}

int main(int argc, const char *argv[])
{
	int sockfd = init_tcp_cli("118.183.253.55", 80);
	if (sockfd < 0)
	{
		return -1;
	}
	
	send_request(sockfd);

	recv_response(sockfd);

	close(sockfd);

	return 0;
}
  1. 代码解释:

1.建立连接

使用init_tcp_cli函数创建与服务器的链接;

  1. 发送请求:

使用send()函数将构造好的HTTP请求发送到服务器。

  1. 接收响应:

使用recv()函数接收服务器的HTTP响应。

输出响应的内容。

  1. 关闭连接:

使用close()函数关闭套接字,释放资源。

相关推荐
false_or_true14 分钟前
一次由 tcp_tw_recycle 引发的“灵异”故障排查:基于双网闸架构的踩坑记
网络·tcp/ip·架构
爱写代码的倒霉蛋26 分钟前
我用book-to-skill把尹圣雨的《TCP/IP网络编程》做成了知识库(适合快速入门网络编程)
网络·网络编程·知识库
..过云雨35 分钟前
19.【网络】多路转接poll、epoll、Reactor反应堆 - 修正版
网络
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)功能全解:AI网关能做Prompt注入防护吗?一文看懂AI网关能力矩阵(v1.2.0)
网络·人工智能·gateway·prompt·mai gateway·企业级ai网关·企业级产品
Lzg_na1 小时前
DHCP 作用、原理、机制和报文格式详解
网络
发量惊人的中年网工2 小时前
SD-WAN 组网方案怎么选?跨地域与多分支企业的选型指南(含成本对比)
服务器·网络·数据库
星恒讯工业路由器2 小时前
从5G-A到6G:工业通信网络的技术演进与产业落地
网络·物联网·5g·智能路由器·工业路由器·工业物联网·5g-a
砚凝霜2 小时前
【软考信息安全】第二十一章 网络设备安全概述与安全机制
网络·安全
Escalating_xu3 小时前
【Linux 网络编程】网络基础概念(下):IP、端口、Socket 与网络字节序,写代码前先打好基础
linux·网络·tcp/ip
网络小江3 小时前
上网第五十二课:加密隧道与拨号专网——安全接入的通俗解释
网络协议