C语言实现HTTP的GET和POST请求

2023-05-16

HTTP请求和IP/TCP

所谓的HTTP协议是基于IP/TCP协议的, 所以要获取远端的html数据只要创建socket对象就足够了;

HTTP是基于IP/TCP加上了网络请求的固定格式

get 请求

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define IPSTR "127.0.0.1" //服务器IP地址;
#define PORT 12345
#define BUFSIZE 1024
 
int main(int argc, char **argv)
{
        int sockfd, ret, i, h;
        struct sockaddr_in servaddr;
        char str1[4096], str2[4096], buf[BUFSIZE], *str;
        socklen_t len;
        fd_set   t_set1;
        struct timeval  tv;
         
         //创建套接字
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
                printf("创建网络连接失败,本线程即将终止---socket error!\n");
                exit(0);
        };
 
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){
                printf("创建网络连接失败,本线程即将终止--inet_pton error!\n");
                exit(0);
        };
 
        if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
                printf("连接到服务器失败,connect error!\n");
                exit(0);
        }
        printf("与远端建立了连接\n");
        memset(str2, 0, 4096);
        strcat(str2, "?username=tom&password=111111");
        str=(char *)malloc(128);
        len = strlen(str2);
        sprintf(str, "%d", len);
 
        memset(str1, 0, 4096);
        strcat(str1, "GET /authen?username=tom&password=111111 HTTP/1.1\n");
        strcat(str1, "Host: 127.0.0.1\n");
        strcat(str1, "Content-Type: text/html\n");
        strcat(str1, "Content-Length: ");
        strcat(str1, str);
        strcat(str1, "\n\n");
 
        // strcat(str1, str2);
        strcat(str1, "\r\n\r\n");
        printf("%s\n",str1);
 
        ret = write(sockfd,str1,strlen(str1));
        if (ret < 0) {
                printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
                exit(0);
        }else{
                printf("消息发送成功,共发送了%d个字节!\n\n", ret);
        }
 
        FD_ZERO(&t_set1);
        FD_SET(sockfd, &t_set1);
 
        while(1){
                sleep(2);
                tv.tv_sec= 0;
                tv.tv_usec= 0;
                h= 0;
                // printf("--------------->1\n");
                h= select(sockfd +1, &t_set1, NULL, NULL, &tv);
                // printf("--------------->2\n");
 
                //if (h == 0) continue;
                if (h < 0) {
                        close(sockfd);
                        printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
                        return -1;
                };
 
                if (h > 0){
                        memset(buf, 0, 4096);
                        i= read(sockfd, buf, 4095);
                        if (i==0){
                                close(sockfd);
                                printf("读取数据报文时发现远端关闭,该线程终止!\n");
                                return -1;
                        }
 
                        printf("%s\n", buf);
						break;
                }
        }
        close(sockfd);
 
 
        return 0;
}

实现POST请求: 

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define IPSTR "61.147.124.120"
#define PORT 80
#define BUFSIZE 1024
 
int main(int argc, char **argv)
{
        int sockfd, ret, i, h;
        struct sockaddr_in servaddr;
        char str1[4096], str2[4096], buf[BUFSIZE], *str;
        socklen_t len;
        fd_set   t_set1;
        struct timeval  tv;
 
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
                printf("创建网络连接失败,本线程即将终止---socket error!\n");
                exit(0);
        };
 
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){
                printf("创建网络连接失败,本线程即将终止--inet_pton error!\n");
                exit(0);
        };
 
        if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
                printf("连接到服务器失败,connect error!\n");
                exit(0);
        }
        printf("与远端建立了连接\n");
 
        memset(str2, 0, 4096);
        strcat(str2, "qqCode=287101329");
        str=(char *)malloc(128);
        len = strlen(str2);
        sprintf(str, "%d", len);
 
        memset(str1, 0, 4096);
        strcat(str1, "POST /webservices/qqOnlineWebService.asmx/qqCheckOnline HTTP/1.1\n");
        strcat(str1, "Host: www.webxml.com.cn\n");
        strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
        strcat(str1, "Content-Length: ");
        strcat(str1, str);
        strcat(str1, "\n\n");
        //str2的值为post的数据
        strcat(str1, str2);
        strcat(str1, "\r\n\r\n");
        printf("%s\n",str1);
 
        ret = write(sockfd,str1,strlen(str1));
        if (ret < 0) {
                printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
                exit(0);
        }else{
                printf("消息发送成功,共发送了%d个字节!\n\n", ret);
        }
 
        FD_ZERO(&t_set1);
        FD_SET(sockfd, &t_set1);
 
        while(1){
                sleep(2);
                tv.tv_sec= 0;
                tv.tv_usec= 0;
                h= 0;
                printf("--------------->1");
                h= select(sockfd +1, &t_set1, NULL, NULL, &tv);
                printf("--------------->2");
 
                //if (h == 0) continue;
                if (h < 0) {
                        close(sockfd);
                        printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
                        return -1;
                };
 
                if (h > 0){
                        memset(buf, 0, 4096);
                        i= read(sockfd, buf, 4095);
                        if (i==0){
                                close(sockfd);
                                printf("读取数据报文时发现远端关闭,该线程终止!\n");
                                return -1;
                        }
 
                        printf("%s\n", buf);
                }
        }
        close(sockfd);
 
 
        return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现HTTP的GET和POST请求 的相关文章

随机推荐

  • STM32F103对SD卡数的读写

    文章目录 一 SD卡协议1 SD卡介绍2 SD卡物理结构2 SD卡寄存器3 SD总线协议4 SD卡的操作模式及切换5 SD卡初始化 xff08 SPI模式 xff09 6 SD卡读取与写入 SPI模式 二 题目要求三 STM32CubeMX
  • C++ 编译过程遇到问题快速查找解决

    一 在使用cmake创建项目 xff0c 并在make过程中 xff0c 遇到以下问题的 xff0c 这里提供定位问题并解决的相关参考 问题描述 xff1a make过程出现如下报错 82 Building CXX object CMake
  • ROS工作空间下新加入功能包编译通过但无法找到功能包解决办法:

    进入工作空间执行 rospack profile
  • 动态内存申请(malloc, calloc, new)之分配虚拟内存空间和物理内存空间

    动态内存申请 xff08 malloc calloc new xff09 之分配虚拟内存空间和物理内存空间 1 动态内存申请的底层系统调用 动态内存申请函数根据申请的内存大小选择不同的系统调用 xff0c 小于128K选择brk系统调用分配
  • jsoncpp与rapidjson易用性与性能评测

    文章目录 jsoncpp与rapidjson易用性与性能评测1 概述2 易用性2 1 jsoncpp2 2 rapidjson 3 性能4 总结 jsoncpp与rapidjson易用性与性能评测 1 概述 jsoncpp和rapidjso
  • 二叉树的构建、遍历及c++实现

    文章目录 二叉树遍历二叉树构建c 43 43 实现原码 二叉树遍历 二叉树有四种遍历方式 xff0c 先序遍历 中序遍历 后序遍历和层次遍历 xff0c 其中层次遍历类似于图结构里面的广度优先搜索BFS xff0c 先序遍历类似于深度优先搜
  • NodeJS开发web应用程序之http,express,socket.io介绍

    文章目录 NodeJS开发web应用程序之http xff0c express xff0c socket io介绍1 http2 express3 socket io NodeJS开发web应用程序之http xff0c express x
  • [编译问题解决]error: ‘atomic_int32_t’ in namespace ‘std’ does not name a type

    编译问题解决 error atomic int32 t in namespace std does not name a type https en cppreference com w cpp atomic atomic c 43 43
  • ffmpge转码常用指令介绍(不断更新...)

    帧率 分辨率 码率 文件大小转换 ffmpeg i input mp4 r 30 b a 100k b v 200k s 1920x1080 fs 4000K output mp4 i 输入视频文件 r 输出帧率 b a 输出音频码率 b
  • 解决linux系统下java调用带breakpad异常捕获的c++ sdk必现crash问题

    问题背景 java通过jni去集成c 43 43 sdk时线上发现会有偶现崩溃 xff0c 为了方便定位native c 43 43 的崩溃 xff0c sdk采用了google breakpad崩溃转储方案 xff08 Google跨平台
  • 基于netlink的Linux Network Monitor实现

    一 背景 来源于产品开发需求 xff0c 需要在linux系统下实现网络状类型查询及网络类型变更通知 xff0c 比如从Ethernet变为Wifi xff0c 从Wifi变为Ethernet等 二 设计方案 Linux系统提供了Netli
  • Altium Designer绘制一个stm32最小系统的电路原理图

    文章目录 一 Altium Designer二 新建工程文件三 绘制原理图库1 绘制元器件2 导入元器件库3 绘制模块 一 Altium Designer Altium Designer 是原Protel软件开发商Altium公司推出的一体
  • C++11面向切面编程(AOP)入门指南

    何为AOP 面向切面编程 xff08 AOP xff0c Aspect Oriented Programming xff09 是一种编程范式 xff0c 允许开发者在不修改原有代码的情况下 xff0c 为程序添加额外的功能 什么是面向切面编
  • 车道线识别/Opencv/传统方法

    车道检测 Advanced Lane Finding Project 实现步骤 使用提供的一组棋盘格图片计算相机校正矩阵 camera calibration matrix 和失真系数 distortion coefficients 校正图
  • 2019新买电脑必备软件

    都2019了 xff0c 怎么还要安装这些垃圾软件 xff01 群丫头买了个新电脑 xff0c 为了避免她踩到笔者曾今踩到的坑 xff0c 更舒心的使用电脑 xff0c 为此特写此文 作为一个电脑平凡使用者 xff0c 用过无数的软件 xf
  • Docker与anaconda+jupyter

    Arch docker的安装 pacman 安装docker sudo pacman S docker docker启动 sudo systemctl start docker 设置开机启动docker sudo systemctl ena
  • Opencv目标追踪

    参考 xff1a https www pyimagesearch com 2018 07 30 opencv object tracking 引言 Opencv作为图像处理开源库包含了Object Tracking目标追踪的一些API xf
  • 使用cmake编译,组织C++项目

    文章目录 前言例一例二例三 前言 这篇博客是我对cmake用法的一些经验总结 还很浅显 如果有错误或者更好的方案 欢迎指正 使用方法统一为在build目录中执行 cmake make 我觉得养成外部编译是一个好习惯 例一 目录结构为 lzj
  • Spring Security Oauth2.0认证授权

    基本概念 认证 用户认证就是判断一个用户的身份是否合法的过程 xff0c 用户去访问系统资源时系统要求验证用户的身份信息 xff0c 身份合法方可继续访问 xff0c 不合法则拒绝访问 常见的用户身份认证方式有 用户名密码登录 xff0c
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include