在Linux系统中使用C语言实现HTTP客户端或服务器通常涉及使用套接字编程和一些HTTP协议的基本知识。下面是一个简单的示例,展示了如何用C语言实现一个HTTP客户端,向一个HTTP服务器发送请求并接收响应。
1. HTTP客户端示例 (C语言)
这个例子展示了如何用C语言通过TCP连接到HTTP服务器,发送HTTP请求并打印出响应。(示例为火狐新闻主页面)
代码示例:
#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;
}
2. 代码解释:
1.建立连接
使用init_tcp_cli函数创建与服务器的链接;
2. 发送请求:
使用send()函数将构造好的HTTP请求发送到服务器。
3. 接收响应:
使用recv()函数接收服务器的HTTP响应。
输出响应的内容。
4. 关闭连接:
使用close()函数关闭套接字,释放资源。