嵌入式学习(Day:31 网络编程2:TCP)

client, server 
browser
b/s  http   
p2p   peer   

TCP的特征:1.有链接;2.可靠传输;3.流式套接字

1、模式  C/S 模式  ==》服务器/客户端模型(服务端1个,客户端很多个)

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()
client:socket()-->connect()-->send()-->close();

服务器端:(一个)

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

1.1 socket函数(创建套接字)

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP       //listfd:监听套接字
                SOCK_DGRAM   用户数据报套接字===>UDP(不稳定)
              SOCK_RAW     原始套接字  ===》IP(一般做网络工具会用)
      protocol 协议 ==》0 表示自动适应应用层协议。(一般都写0)

返回值:成功 返回申请的套接字id
        失败  -1;

1.2 bind函数(创建链接,把端口号和套接字关联起来)

、int bind(int sockfd, struct sockaddr *my_addr,socklen_t addrlen);   (服务端必须调bind,客户端:可选调(除非特别指定客户端的端口号时))
            
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。

        如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id    (sockfd)
      my_addr 是物理接口的结构体指针。表示该接口的信息
  返回值:成功 0
        失败  -1;
                                                       (UDP收发数据时是无连接的)
1.3  int listen(int sockfd, int backlog);          (作用:使套接字进入监听状态,允许被链接)     
    功能:在参数1所在的套接字id上监听等待链接。
    参数:sockfd  套接字id
          backlog 允许链接的个数。(同一时刻3次握手的排队数,没排队的等待再试)
    返回值:成功  0
            失败  -1;
1.4 int accept(int sockfd, struct sockaddr *addr,   (该函数会阻塞等待,直到有客户端来连接) conn,通信套接字
                socklen_t *addrlen);
   功能:从已经监听到的队列中取出有效的客户端链接并接入到当前程序。
   参数:sockfd 套接字id
            addr  如果该值为NULL ,表示不论客户端是谁都接入。
                如果要获取客户端信息,则事先定义变量
               并传入变量地址,函数执行完毕将会将客户端
               信息存储到该变量中。
         addrlen: 参数2的长度,如果参数2为NULL,则该值
                     也为NULL;
                 如果参数不是NULL,&len;
                  一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;
                从该代码之后所有通信都基于该id

           失败  -1;

1.5 接收函数:/发送函数:

    read()/write ()   ///通用文件读写,可以操作套接字。
    recv(,0) /send(,0)      ///TCP 常用套机字读写,0表示recv会阻塞等待;(send会阻塞,返回值,代表发送成功的个数,可为0,或者<=要发送的字符数)
    recvfrom()/sendto() ///UDP 常用套接字读写

accept(三次握手函数):conn;链接上以后的找conn;
listfd:监听,门面,

     1. 发送函数:send(见6)

   2.接收函数:recv
ssize_t recv(int sockfd, void *buf, size_t len,int flags);
功能:从指定的sockfd套接字中以flags方式获取长度为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或动态内存。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
        失败  -1;


1.6    close()  ===>关闭指定的套接字id;

===================================================
客户端:

2.1    请求链接函数:connect

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
   功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
   参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
           addrlen: 参数2的长度。
   返回值:成功 0
              失败 -1;

2.2   发送函数:send

int send(int sockfd, const void *msg, 
        size_t len, int flags);
   功能:从msg所在的内存中获取长度为len的数据以flags方式写入到sockfd对应的套接字中。

   参数:sockfd:
               如果是服务器则是accept的返回值新fd
                如果是客户端则是sockfd的返回值旧fd

               msg 要发送的消息
                 len 要发送的消息长度
                 flags 消息的发送方式。

  返回值:成功  发送的字符长度
                    失败  -1;

3.黏包的解决办法:

①设置结束标志;(如以'\0'作为结束标志)

②固定大小;(1.每次传固定大小个字节;2.两边使用相同的结构体);

③自定义协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析常用模型合集(三)同期群、逻辑树、假设检验等

前面两篇文章&#xff0c;我们将比较大、较为系统的分析方法作了一个介绍&#xff0c;本文是最后一篇&#xff0c;将剩余的一些讲一讲。 数据分析常用模型合集&#xff08;二&#xff09;RARRA模型、RFM模型-CSDN博客 剩下的一些模型&#xff0c;其实不应叫做模型&#xff0c;…

qt+ffmpeg 实现音视频播放(四)之音视频同步

在处理音视频数据时&#xff0c;解码音频的数据往往会比解码视频的数据比较慢&#xff0c;所以我们在播放音视频时&#xff0c;音频和视频的数据会出现渐渐对不上的情况。尤其在播放时间越长的时候&#xff0c;这种对不上的现象越明显。 为了解决这一问题&#xff0c;人们想出…

PHP基础学习笔记(常用函数)

字符串 strlen — 获取字符串长度 <?php $str abcdef; echo strlen($str); // 6$str ab cd ; echo strlen($str); // 7 //strlen() 返回的是字符串的字节数&#xff0c;而不是其中字符的数量。 ?>strpos — 查找字符串首次出现的位置 $mystring abc; $findme …

051、Python 快速把多个元素连接成一个字符串的方法

要想快速地将列表或元组中的元素连接成一个字符串&#xff0c;有一个特别实用地方法&#xff1a;join() 方法。 join() 方法&#xff1a;一个用于将序列中的元素以指定的分隔符连接成一个字符串的方法&#xff0c;这个方法通常用于字符串操作。 基本语法&#xff1a; separa…

在windows操作系统上安装MariaDB

最近收到关于数据库在哪里看的评论&#xff0c;所以就一不做二不休&#xff0c;把安装数据库的步骤写一篇文章吧。 这篇文章介绍如何在windows上完成MariaDB-10.6.5版本的安装&#xff0c;对应MySQL-8.x版本。 第一步&#xff1a;下载安装包 通过以下网盘链接下载MariaDB-10.6…

Spark入门:KMeans聚类算法

聚类&#xff08;Clustering&#xff09; 是机器学习中一类重要的方法。其主要思想使用样本的不同特征属性&#xff0c;根据某一给定的相似度度量方式&#xff08;如欧式距离&#xff09;找到相似的样本&#xff0c;并根据距离将样本划分成不同的组。聚类属于典型的无监督学习&…

国产信创CPU之飞腾CPU剖析

CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU已形成自主架构、x86、ARM三大阵营。自主阵营中&#xff0c;龙芯、申威分别基于MIPS和Alpha推出loong ISA和SW-64。ARM阵营以鲲鹏、飞腾为代表&#xff0c;利用ARM IP授权开发处理器。x86阵营由海光、兆芯等主导&#xff…

【Linux】操作系统中的文件系统管理:磁盘结构、逻辑存储与文件访问机制

文章目录 前言&#xff1a;1. 磁盘机械结构2. 磁盘物理结构3. 磁盘的逻辑存储3. 1. 文件名呢&#xff1f;3.2 对文件的增删查改与 路径3.3. 文件 4. 软硬链接4.1. 操作观察现象4.2. 软硬链接的原理4.3. 软硬链接的应用场景 总结 前言&#xff1a; 在现代操作系统中&#xff0c…

day27-完全平方数(背包问题)

题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 1…

基于人工智能的运输路径规划系统

基于人工智能的运输路径规划系统是现代物流领域中一项重要的技术应用&#xff0c;该系统通过集成先进的人工智能算法和数据分析技术&#xff0c;为运输行业提供了更为高效、准确的路径规划服务。以下是关于该系统的详细介绍&#xff1a; 一、系统概述 基于人工智能的运输路径…

Python基础:在多个.py文件组成的项目中如何安全的使用文件路径(绝对路径安全,相对路径可移植性好,如何选?)

在Python项目中使用相对路径时,路径的计算是基于当前执行脚本的位置,即当前工作目录(Current Working Directory, CWD)。这通常是你从中启动Python解释器的目录。这种方式在简单脚本或当你直接从命令行运行单个脚本文件时行得通,但在较大的项目或多层目录结构中可能导致路…

Flutter 中的 PopupMenuTheme 小部件:全面指南

Flutter 中的 PopupMenuTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建美观、响应式的移动、Web 和桌面应用。Flutter 的 Material 组件库中包含了丰富的 UI 组件&#xff0c;其中 PopupMenuButt…

基于Springboot+vue实现的汽车服务管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

《effective c++》学习笔记一

从今天开始看《effective c》这本书&#xff0c;把学到的东西当做笔记记下来&#xff0c;算是督促自己学习吧&#xff0c;也算是和大家一起分享一点东西&#xff0c;理解不当的地方&#xff0c;请谅解。&#xff08;每天更新三个条款&#xff09;。 条款1&#xff1a;视C为一个…

外贸如何让新客户返单以及转介绍?

要让外贸新客户返单以及转介绍&#xff0c;关键在于提供卓越的服务、建立信任和维护良好的客户关系。以下方法可以借鉴&#xff1a; 1. 提供优质的产品和服务 - 产品质量保证&#xff1a;确保产品质量始终符合或超过客户预期。 - 定制服务&#xff1a;根据客户需求提供个性化…

45.自定义线程池(三)-拒绝策略

拒绝策略采用函数式接口参数传入&#xff0c;策略模式 FunctionalInterface public interface RejectPolicy<T> {void reject(BlockingQueue<T> queue, T task); } package com.xkj.thread.pool;import com.aspose.words.Run; import lombok.extern.slf4j.Slf4j;…

Flutter 中的 ButtonBarTheme 小部件:全面指南

Flutter 中的 ButtonBarTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了丰富的组件来帮助开发者构建高性能、美观的应用。在 Flutter 的 Material 组件库中&#xff0c;ButtonBar 是一个用于展示按钮集合的组件&#xff…

java多线程之synchronized详解

锁的内存语义 锁可以让临界区互斥执行&#xff0c;还可以让释放锁的线程向同一个锁的线程发送消息锁的释放要遵循Happens-before原则&#xff08;锁规则&#xff1a;解锁必然发生在最后的加锁之前&#xff09;锁在java中的具体表现时Synchronized和Lock 复现步骤 通过gradle…

SaaS 电商设计 (十一) 那些高并发电商系统的限流方案设计

目录 一.什么是限流二.怎么做限流呢2.1 有哪些常见的系统限流算法2.1.1 固定窗口2.1.1 滑动窗口2.1.2 令牌桶2.1.3 漏桶算法 2.2 常见的限流方式2.2.1 单机限流&集群限流2.2.2 前置限流&后置限流 2.3 实际落地是怎么做的2.3.1 流量链路2.3.2 各链路限流2.3.2.1 网关层2…

Spring Boot(七十七):SpringBoot实现接口内容协商功能

1 什么是内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格式进行返回,而如果需要一个接口即支持 json,又支持其他格式,开发和维护多套代码显然是不合理的,而 Spring 又恰好提供了该功能,那便是Conten…