日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux C 实现HTTP get 及post 请求

發(fā)布時間:2023/12/31 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux C 实现HTTP get 及post 请求 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考文章:linux C 實現(xiàn)HTTP get 及post 請求

C語言實現(xiàn)HTTP的GET和POST請求

C語言實現(xiàn)HTTP的GET和POST請求例程參考

1.main.c文件

#include <stdio.h> #include "http_tool.h"int main() {printf("Hello, World!\n");char *url2 = "http://localhost:12600/getUserList";char *url = http_get(url2);printf("%s", url);return 0; }

2.http_tool.h文件

/* * Created by fiend on 2021/7/13. */#ifndef C_HTTPCLIENT3_HTTP_TOOL3_H #define C_HTTPCLIENT3_HTTP_TOOL3_H#endif //C_HTTPCLIENT3_HTTP_TOOL3_H// 參考: https://blog.csdn.net/sjin_1314/article/details/41776679 #ifndef _MY_HTTP_H #define _MY_HTTP_H#define MY_HTTP_DEFAULT_PORT 80char *http_get(const char *url);char *http_post(const char *url, const char *post_str);#endif

3.http_tool.c文件

#include "http_tool.h"#include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <netdb.h>#include <string.h>#define BUFFER_SIZE 1024 #define HTTP_POST "POST /%s HTTP/1.1\r\nHOST: %s:%d\r\nAccept: */*\r\n"\"Content-Type:application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s" #define HTTP_GET "GET /%s HTTP/1.1\r\nHOST: %s:%d\r\nAccept: */*\r\n\r\n"static int http_tcpclient_create(const char *host, int port) {struct hostent *he;struct sockaddr_in server_addr;int socket_fd;if ((he = gethostbyname(host)) == NULL) {return -1;}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(port);server_addr.sin_addr = *((struct in_addr *) he->h_addr);if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {return -1;}if (connect(socket_fd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) == -1) {return -1;}return socket_fd; }static void http_tcpclient_close(int socket) {// lpfclose(socket); }static int http_parse_url(const char *url, char *host, char *file, int *port) {char *ptr1, *ptr2;int len = 0;if (!url || !host || !file || !port) {return -1;}ptr1 = (char *) url;if (!strncmp(ptr1, "http://", strlen("http://"))) {ptr1 += strlen("http://");} else {return -1;}ptr2 = strchr(ptr1, '/');if (ptr2) {len = strlen(ptr1) - strlen(ptr2);memcpy(host, ptr1, len);host[len] = '\0';if (*(ptr2 + 1)) {memcpy(file, ptr2 + 1, strlen(ptr2) - 1);file[strlen(ptr2) - 1] = '\0';}} else {memcpy(host, ptr1, strlen(ptr1));host[strlen(ptr1)] = '\0';}//get host and ipptr1 = strchr(host, ':');if (ptr1) {*ptr1++ = '\0';*port = atoi(ptr1);} else {*port = MY_HTTP_DEFAULT_PORT;}return 0; }static int http_tcpclient_recv(int socket, char *lpbuff) {int recvnum = 0;recvnum = recv(socket, lpbuff, BUFFER_SIZE * 4, 0);return recvnum; }static int http_tcpclient_send(int socket, char *buff, int size) {int sent = 0, tmpres = 0;while (sent < size) {tmpres = send(socket, buff + sent, size - sent, 0);if (tmpres == -1) {return -1;}sent += tmpres;}return sent; }static char *http_parse_result(const char *lpbuf) {char *ptmp = NULL;char *response = NULL;ptmp = (char *) strstr(lpbuf, "HTTP/1.1");if (!ptmp) {printf("http/1.1 not faind\n");return NULL;}if (atoi(ptmp + 9) != 200) {printf("result:\n%s\n", lpbuf);return NULL;}ptmp = (char *) strstr(lpbuf, "\r\n\r\n");if (!ptmp) {printf("ptmp is NULL\n");return NULL;}response = (char *) malloc(strlen(ptmp) + 1);if (!response) {printf("malloc failed \n");return NULL;}strcpy(response, ptmp + 4);return response; }char *http_post(const char *url, const char *post_str) {char post[BUFFER_SIZE] = {'\0'};int socket_fd = -1;char lpbuf[BUFFER_SIZE * 4] = {'\0'};char *ptmp;char host_addr[BUFFER_SIZE] = {'\0'};char file[BUFFER_SIZE] = {'\0'};int port = 0;int len = 0;char *response = NULL;if (!url || !post_str) {printf(" failed!\n");return NULL;}if (http_parse_url(url, host_addr, file, &port)) {printf("http_parse_url failed!\n");return NULL;}//printf("host_addr : %s\tfile:%s\t,%d\n",host_addr,file,port);socket_fd = http_tcpclient_create(host_addr, port);if (socket_fd < 0) {printf("http_tcpclient_create failed\n");return NULL;}sprintf(lpbuf, HTTP_POST, file, host_addr, port, strlen(post_str), post_str);if (http_tcpclient_send(socket_fd, lpbuf, strlen(lpbuf)) < 0) {printf("http_tcpclient_send failed..\n");return NULL;}//printf("發(fā)送請求:\n%s\n",lpbuf);/*it's time to recv from server*/if (http_tcpclient_recv(socket_fd, lpbuf) <= 0) {printf("http_tcpclient_recv failed\n");return NULL;}http_tcpclient_close(socket_fd);return http_parse_result(lpbuf); }char *http_get(const char *url) {char post[BUFFER_SIZE] = {'\0'};int socket_fd = -1;char lpbuf[BUFFER_SIZE * 4] = {'\0'};char *ptmp;char host_addr[BUFFER_SIZE] = {'\0'};char file[BUFFER_SIZE] = {'\0'};int port = 0;int len = 0;if (!url) {printf(" failed!\n");return NULL;}if (http_parse_url(url, host_addr, file, &port)) {printf("http_parse_url failed!\n");return NULL;}//printf("host_addr : %s\tfile:%s\t,%d\n",host_addr,file,port);socket_fd = http_tcpclient_create(host_addr, port);if (socket_fd < 0) {printf("http_tcpclient_create failed\n");return NULL;}sprintf(lpbuf, HTTP_GET, file, host_addr, port);if (http_tcpclient_send(socket_fd, lpbuf, strlen(lpbuf)) < 0) {printf("http_tcpclient_send failed..\n");return NULL;}// printf("發(fā)送請求:\n%s\n",lpbuf);if (http_tcpclient_recv(socket_fd, lpbuf) <= 0) {printf("http_tcpclient_recv failed\n");return NULL;}http_tcpclient_close(socket_fd);return http_parse_result(lpbuf); }

總結(jié)

以上是生活随笔為你收集整理的linux C 实现HTTP get 及post 请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。