当前位置: 首页 > news >正文

自学嵌入式 day33 TCP、HTTP协议(超文本传输协议)

6、黏包问题

        (1)、原因:发送方发送数据太快或者接收方接收数据太慢,导致数据在缓冲区缓存。

        (2)、解决方法:

                ①发送指定大小数据(结构体)

                问题:结构体对齐问题(比如:指定字节对齐)

                        发送数据类型多样化时,接收方难以区分接收大小

                ②为发送数据增加明显的分隔符(应用层根据分隔符进行解析)

                ③自定义应用层的数据帧

HTTP协议:应用在浏览器和服务器中

一、万维网:WWW(World Wide Web)
1、定义:世界范围内的,联机式的信息储藏所。    
2、万维网解决了获取互联网上的数据时需要解决的以下问题:
(1)、怎样标识分布在整个互联网上的文档  URL(统一资源定位符)
(2)、用什么样的协议实现万维网上的各种链接  HTTP
(3)、怎么使用户能够方便的查看文档数据 HTML (超文本标记语言)

二、URL:统一资源定位符
1、定义:表示从因特网上得到的资源位置和访问这些额资源的方法。

2、格式:<协议>://<主机>:<端口>/<路径>

三、HTTP(HyperText Transfer Protocol):超文本传输协议,应用层

1、定义:定义了万维网客户端如何想万维网服务器请求万维网文档,以及服务器怎样把文档传给客户端。

2、 HTTP工作过程:
(1)建立TCP连接
(2)客户端向服务器发送HTTP请求报文
(3)服务器向客户端发送HTTP响应报文
(4)释放TCP连接



3、HTTP报文格式
请求报文:请求行、消息报头、请求正文
响应报文:状态行、消息报头、响应正文


4、请求方式
GET     请求获取Request-URI所标识的资源
POST    在Request-URI所标识的资源后附加新的数据
HEAD    请求获取由Request-URI所标识的资源的响应消息报头
PUT     请求服务器存储一个资源,并用Request-URI作为其标识
DELETE  请求服务器删除Request-URI所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
CONNECT 用于代理服务器
4.状态码

        1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求

        200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

四、抓包(windows)

        1、

        2、

五、客户端函数

#include"head.h"

int http_tcp(const char*argv,unsigned short port)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(port);
seraddr.sin_addr.s_addr = inet_addr(argv);
int ret = connect(sockfd,(struct sockaddr*)&seraddr,sizeof(seraddr));
if(ret < 0)
{
perror("connect fail");
return -1;
}
return sockfd;
}

int http_send(int argc)
{
char *p = "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(argc,p,strlen(p),0);
if(size < 0)
{
perror("send fail");
return -1;
}
return 0;
}

int http_recv(int argc)
{
char buf[1024] = {0};
while(1)
{
memset(buf,0,sizeof(buf));
ssize_t size = recv(argc,buf,sizeof(buf) -1,0);
if(size < 0)
{
perror("recv fail");
return -1;
}
if(size == 0)
{
printf("\nconnect end");
break;
}
printf("%s",buf);
}
return 0;
}

int main()
{
int sockfd = http_tcp("1.81.2.197",80);
http_send(sockfd);
http_recv(sockfd);
close(sockfd);
return 0;

}


文章转载自:
http://gamblesome .kjawz.cn
http://polypropylene .kjawz.cn
http://jaggies .kjawz.cn
http://katydid .kjawz.cn
http://horizonless .kjawz.cn
http://prorupt .kjawz.cn
http://hierodule .kjawz.cn
http://subhepatic .kjawz.cn
http://impeccable .kjawz.cn
http://gunnera .kjawz.cn
http://tylopod .kjawz.cn
http://philosopher .kjawz.cn
http://poppycock .kjawz.cn
http://ample .kjawz.cn
http://incrassated .kjawz.cn
http://zante .kjawz.cn
http://naled .kjawz.cn
http://slue .kjawz.cn
http://defeminize .kjawz.cn
http://vellicate .kjawz.cn
http://superloo .kjawz.cn
http://ionic .kjawz.cn
http://platitudinous .kjawz.cn
http://gayest .kjawz.cn
http://triphenylamine .kjawz.cn
http://menservants .kjawz.cn
http://consistorial .kjawz.cn
http://logo .kjawz.cn
http://zamboanga .kjawz.cn
http://bulbospongiosus .kjawz.cn
http://www.dtcms.com/a/293770.html

相关文章:

  • MySQL深度理解-深入理解MySQL索引底层数据结构与算法
  • Hexo - 免费搭建个人博客03 - 将个人博客托管到github,个人博客公开给大家访问
  • Day01_C++
  • 基于 MaxScale 实现 MySQL 读写分离
  • 使用Imgui和SDL2做的一个弹球小游戏-Bounze
  • 3.6 常见问题与调试
  • 编程语言Java——核心技术篇(二)类的高级特性
  • Semantic Kernel实现调用Kernel Memory
  • 华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑
  • Python-初学openCV——图像预处理(一)
  • C++刷题 - 7.23
  • 开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端
  • 在 Ubuntu 20.04.5 LTS 系统上安装 Docker CE 26.1.4 完整指南
  • Spring Cloud Alibaba Sentinel 基本工作原理源码阅读
  • MACOS安装配置Gradle
  • 国产数据库转向 “融合” 赛道:电科金仓的下一代形态定义之路
  • 基于Matlab传统图像处理技术的车辆车型识别与分类方法研究
  • 资本押注会成长的玩具,AI潮玩赛道开始升温
  • 华为云ELB(弹性负载均衡)持续报异常
  • 永磁同步电机控制算法--弱磁控制(负载能力最大化的定交轴)
  • 【C++】C++ 的入门语法知识1
  • 在easyui中如何设置自带的弹窗,有输入框
  • 解决Spring事务中RPC调用无法回滚的问题
  • 零基础学编程,编程从入门到精通系列教程,附:编程工具箱之时间计算构件的用法#零基础自学编程 学习计划#新手学编程 高效学习方法
  • HF83311_VB1/HF83311Q_VB1:高性能USB HiFi音频解码器固件技术解析
  • Leetcode-15. 三数之和
  • 《计算机“十万个为什么”》之 [特殊字符] 深浅拷贝 引用拷贝:内存世界的复制魔法 ✨
  • 1.1 Deep learning?pytorch ?深度学习训练出来的模型通常有效但无法解释合理性? 如何 解释?
  • 英语词汇积累Day1-10(summary)
  • Django实战:Python代码规范指南