void send_http_get_request(int sockfd, const char *host, const char *path) char request[MAX_SIZE]; snprintf(request, sizeof(request), "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", path, host); printf("%s \r\n", request); // 发送get请求 if (write(sockfd, request, strlen(request)) < 0) error("Error writing to socket"); printf("send request\r\n"); void receive_http_response(int sockfd) char response[MAX_SIZE]; ssize_t n = 0; while ((n = read(sockfd, response, sizeof(response) - 1)) > 0) response[n] = '\0'; // get 请求返回的数据 printf("response: %s\r\n", response); if (n < 0) error("Error reading from socket");
	// 域名或IP地址连接
	#define domain 1
	#if domain
	// 域名情况下的与服务端建立socket连接
    const char *host = "www.domin.com";
    const char *path = "/socket/main";
    int port = 80;
    // 设置服务器地址
    struct sockaddr_in server_addr;
    bzero((char *)&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&server_addr.sin_addr.s_addr, server->h_length);
    server_addr.sin_port = htons(port);
    #else
    const char *host = "192.168.3.1";
    const char *path = "/socket/main";
    int port = 80;
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    inet_pton(AF_INET, host, &(server_addr.sin_addr));
	#endif
    // 创建socket
    int sockfd = create_socket();
    // 连接到服务器
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
        error("Error connecting");
    // 发送HTTP get请求
    send_http_get_request(sockfd, host, path);
    // 接收并打印HTTP响应
    // receive_http_response(sockfd);
    // 关闭socket
    close_socket(sockfd);
    return 0;

需要的头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>

post的实现

在上面的get的基础上进行了一定的修改,实现了post的功能
在此使用的body数据格式为json数据,可以更具自己的情况进行一定的修改

  • post的请求函数,通过socket发送url,与body
void send_http_post_request(int sockfd, const char *host, const char *path, const char *body) {
    char request[MAX_SIZE];
    // 注意数据
    sprintf(request, "POST %s HTTP/1.1\r\n"
                     "Host: %s\r\n"
                     "Content-Type: application/json\r\n"
                     "Content-Length: %ld\r\n"
                     "\r\n"
                     "%s",
            path, host, strlen(body), body);
    if (write(sockfd, request, strlen(request)) < 0) {
        error("Error writing to socket");

与上面get的区别仅仅只有path进行了一定的接口和增加了json格式的body数据

const char *path = "/socket/main/post";
char *body= malloc(256);
sprintf(body, "{"
                  "\"name\":\"%s\","
                  "\"id\":%d,"
                  "\"age\":%d"
                  name,id,age);
    // 发送HTTP post请求
    send_http_post_request(sockfd, host, path, (const char *)data);
    // 接收并打印HTTP响应
    receive_http_response(sockfd);
// 接收数据
				
这是一个linux下使用C的标准socket,进行http访问的例子。通过socket发送get请求,从中国天气网获得指定城市的天气。 该例子在ubuntu 14.04和AM3358的嵌入式linux3.14下实际测试可用。 如果需要在嵌入式linux下使用,需要修改Makefile文件的CC和LINK项,指向相应的交叉编译器。
C语言发送http请求和普通的socket通讯,原理是一样的.无非就三步connect()连上服务器,send()发送数据,recv()接收数据.只不过发送的数据有特定的格式.下面的是简单发送一个http请求的例子#include <netinet/in.h> #include <sys/socket.h> #include <netdb.h>#include <unistd.h> #include
此代码演示了如何使用C语言创建一个简单的HTTP请求,并接收服务器的响应。 首先,使用 socket() 函数创建套接字,然后使用 connect() 函数连接到服务器。 然后,使用 send() 函数发送HTTP请求到服务器。 最后,使用 recv() 函数接收服务器的响应,并将其打印出来。 在接收响应时,我们使用循环来接收所有数据,直到 recv() 返回0,表示服务器关闭了连接。 最后,使用 close() 函数关闭套接字,释放资源。