有名信号量、网络协议模型、UDP编程发送端

news2024/11/15 13:42:18

我要成为嵌入式高手之3月5日Linux高编第十五天!!
______________________________________________________

学习笔记

有名信号量

1、创建semget

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);

功能:创建一组信号量

参数:

        key:IPC对象的key值

        nsems:信号量的个数

        semflag:IPC_CREAT

返回值:成功返回信号量ID,失败返回-1;

2、操作semctl

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, ...);

功能:向信号灯发送命令

参数:

        semdi:信号灯ID号

        semnum:具体操作信号量的编号

        cmd:命令

                IPC_SET:设置权限

                IPC_RMID:删除信号灯

                SETVAL:初始化信号

返回值:成功0,失败-1;

初始化: 

           union semun {                                                                                                                                                                                                                                                                                                 
               int              val;                                /* Value for SETVAL */
               struct semid_ds *buf;                      /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;                   /* Array for GETALL, SETALL */
               struct seminfo  *__buf;                   /* Buffer for IPC_INFO(Linux-specific) */
           };

3、申请semop

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semop(int semid, struct sembuf *sops, size_t nsops);

unsigned short sem_num;  /* semaphore number */(操作的信号量的下标)
short                 sem_op;    /* semaphore operation */(具体对信号量的操作,申请-1,释放+1)
short                 sem_flg;    /* operation flags */(信号量完成某个操作)

参数:

        semid:信号灯的id号

        sops:信号量操作的数组的首地址

        nsops:数组元素个数

返回值:成功0,失败-1;

4、释放semop

和申请是同一个函数

网络

用处:数据共享、数据传输  

一、网络协议模型

OSI协议模型

是一种分层模型,下一层为上一层提供服务

        应用层:实际发送的数据

        表示层:发送的数据是否要加密

        会话层:是否建立会话链接

        传输层:数据传输的方式(数据报、流式传输)

        网络层:数据的路由(如何从一个局域网到达另一个局域网)IP地址

        数据链路层:局域网下如何通信

        物理层:物理介质的连接

TCP / IP协议模型

        应用层:传输的数据

        传输层:传输的方式

        网络层:数据如何从一台主机到达另一台主机

        网络接口层:物理介质的连接

应用层

        HTTP协议:超文本传输协议

        HTTPS协议:加密的HTTP协议

        FTP协议:文件传输协议

        TFTP协议:简单文本传输协议

        SMTP协议:邮件传输协议

        MQTT协议

        TELNET协议

传输层

UDP协议

用户数据报协议

特点:

        1、实现机制简单

        2、资源开销小

        3、不安全不可靠

TCP协议

传输控制协议

特点:

        1、实现机制复杂

        三次握手建立连接

        2、资源开销大

        3、安全可靠

        四次挥手断开链接

网络层

IPV4

IP地址:唯一标识网络当中的 一台主机的标号

IP地址:网络位+主机位

子网掩码:用来标识IP地址的网络位和主机位

                    子网掩码是1的部分表示IP地址的网络位

                    子网掩码是0的部分表示IP地址的主机位

网段号:主网络位不变,机位全为0,表示网段号(192.168.1.0)

广播地址:网络位不变,主机位全为1,表示广播地址(192.168.1.255)

IP地址类型:

A类:1.0.0.0 — 126.255.255.255

        子网掩码:255.0.0.0(可以容纳1677724台主机)

        管理超大规模网络

        10.0.0.0 — 10.255.255.255(私有地址)

B类:128.0.0.0 — 191.255.255.255

        子网掩码:255.255.0.0(可以容纳65534台主机)

        管理大中规模型网络

C类:192.0.0.0 — 223.255.255.255

        子网掩码:255.255.255.0(可以容纳254台主机)

        管理中小型规模网络

D类:224.0.0.0 — 239.0.0.0

        用于组播

E类:240.0.0.0 — 255.255.255.255

        用于实验

MAC地址

网卡物理地址,是唯一的

二、UDP编程

socket套接字编程:

1、发送端

①socket

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

int socket(int domain, int type, int protocol);

功能:创建一个用来通信的文件描述符

参数:

        domain:通信使用的协议族 AF_INET(IPv4协议族)

        type:套接字类型

                SOCK_STREAM 流式套接字

                SOCK_DGRAM 数据报套接字

                SOCK_RAW:原始套接字

        protocol:协议,默认传0

返回值:成功返回文件描述符,失败返回-1;

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <netinet/ip.h> /* superset of previous */

       tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);

②sendto

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

功能:利用套接字向指定地址发送数据信息

参数:

        sockfd:套接字文件描述符

        buf:发送数据空间首地址

        len:发送数据的长度

        flages:发送的属性默认为0

        dest_addr:发送到哪里的空间首地址

        addrlen:该地址长度

        接收方结构体   
        struct sockaddr_in {
               sa_family_t      sin_family; /* address family: AF_INET */
               in_port_t          sin_port;   /* port in network byte order */(端口号,不要用10000以下)
               struct in_addr  sin_addr;   /* internet address */(IP地址)
           };

           /* Internet address. */——结构体中的sin_addr
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

        结合起来为:recvaddr.sin_addr.s_addr(转换为32位的ip地址)

返回值:成功返回实际发送的字节数,失败返回-1;

③inet_addr:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);

功能:将字符串IP地址转换为内存当中的IP地址

④htons

uint16_t htons(uint16_t hostshort);

功能:将本地字节序转换成网络的大端字节序

#include "head.h"

int main(void)
{
    int sockfd = 0;
    struct sockaddr_in recvaddr;
    char tmpbuff[1024] = {"how are you?"};
    ssize_t nsize = 0;

    /*创建用来通信的UDP套接字*/
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);//通信使用的协议族(AF_INET是IPv4协议族),套接字类型:数据报套接字;默认0
    if (-1 == sockfd)
    {
        perror("fail to socket");
        return -1;
    }

    /*对接收方地址赋值*/
    recvaddr.sin_family = AF_INET;
    recvaddr.sin_port = htons(50000);//本地字节序转换为网络的大端字节序
    recvaddr.sin_addr.s_addr = inet_addr("192.168.1.101");//函数接口inet_addr将字符串的ip地址转换为内存当中的IP地址
  //前面是ip地址转换为32位之后的变量名

    /*发送信息*/
    nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
    //0为发送的属性,默认为0,发送到哪里(那个空间的首地址),那个地方的空间大小
    if (-1 == nsize)
    {
        perror("fail to sendto");
        return -1;
    }
    printf("成功发送%ld字节!\n", nsize);
    close(sockfd);

    return 0;
}

2、接收端 

recvfrom

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

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

相关文章

JVM 的垃圾回收机制以及垃圾回收算法的详解

目录 1、JVM 的垃圾回收机制 2、识别垃圾 2.1、引用计数 2.2、可达性分析 3、垃圾回收算法 3.1、标记-清除 3.2、复制算法 3.3、标记-整理 4、分代回收 1、JVM 的垃圾回收机制 对于&#xfeff;程序计数器&#xfeff;、&#xfeff;虚拟机栈&#xfeff;、&#xfe…

C if...else 语句

一个 if 语句 后可跟一个可选的 else 语句&#xff0c;else 语句在布尔表达式为 false 时执行。 语法 C 语言中 if…else 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ } else {/* 如果布尔表达式为假将执行的语句 */ }如果布尔表…

VMware Workstation17虚拟机安装

文章目录 一.下载安装软件二.安装过程选项三.序列化四.检查是否安装成功 一.下载安装软件 方式一&#xff1a;官网下载 方式二: 网盘下载(从官网里面下载的正版) 二.安装过程选项 双击下载的安装包&#xff0c;按以下图片选项进行安装 如果没有以下图片的"升级"选…

红队专题-开源漏扫-巡风xunfeng源码剖析与应用

开源漏扫-巡风xunfeng 介绍主体两部分:网络资产识别引擎,漏洞检测引擎。代码赏析插件编写JSON标示符Python脚本此外系统内嵌了辅助验证功能文件结构功能 模块添加IP三. 进行扫描在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/de587a6f6f694…

SpringCloudGateway工作原理与链路图

SpringCloudGateway基本介绍 Spring Cloud Gateway 构建于Spring Boot 2.x、 Spring WebFlux和Project Reactor之上。因此,在使用 Spring Cloud Gateway 时,您可能不会应用许多熟悉的同步库(例如 Spring Data 和 Spring Security)和模式。 Spring Cloud Gateway 需要 Sprin…

超好用的一键生成原创文案方法

在现代社会中&#xff0c;原创文案不管是在营销中&#xff0c;还是在品牌推广中都起着至关重要的作用。然而&#xff0c;对于许多人来说&#xff0c;创作出令人印象深刻且引人注目的原创文案并不容易。但随着技术的发展&#xff0c;我们现在可以利用一键生成原创文案的方法来帮…

(3)应用与信息

文章目录 前言 3.1 FlightDeck FrSky发射器应用程序 3.2 MAVLink2数据包签名(安全) 3.3 MAVLink高延迟协议 3.4 无线地面站连接中继器 1 概述 2 组件 3 设置 3.5 遥测无线电区域条例 3.6 用于OpenTX的Yaapu遥测脚本 前言 FlightDeck FrSky Transmitter AppMAVLink2 …

GitHub会员充值

GitHub是一个基于Web的代码托管平台&#xff0c;为开发者提供了协作、版本控制和代码管理的工具。它允许个人和团队共同协作开发软件项目&#xff0c;并提供了许多功能&#xff0c;使得代码的管理和维护更加容易 版本控制系统&#xff1a; GitHub使用Git作为其版本控制系统。Gi…

使用MATLAB快速对波形进行傅里叶分解到有限次谐波

使用MATLAB快速对波形进行傅里叶分解到有限次谐波 目录 使用MATLAB快速对波形进行傅里叶分解到有限次谐波1、解析表达式分解到有限次谐波1.1、理论分析1.2、全部代码 2、数值波形分解到有限次谐波2.1、基础理论2.2、对应代码 很多时候对功率放大器设计阻抗空间的分析都是从波形…

初阶数据结构之---二叉树的顺序结构-堆

引言 今天要讲的堆&#xff0c;不是操作系统虚拟进程地址空间中&#xff08;malloc&#xff0c;realloc等开空间的位置&#xff09;的那个堆&#xff0c;而是数据结构中的堆&#xff0c;它们虽然名字相同&#xff0c;却是截然不同的两个概念。堆的底层其实是完全二叉树&#x…

数据结构之队列详解(C语言手撕)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

CorelDRAW Essentials2024使用简单易学的图形软件,让设计充满乐趣

CorelDRAW Essentials 2024使用简单易学的图形软件&#xff0c;让设计充满乐趣 创作引人注目的海报、卡片、社交媒体图片等。 增强功能&#xff01;支持文件导入/导出新增功能&#xff01;支持 WebP 文件&#xff0c;提高网页兼容性并优化图像交付增强功能&#xff01;显著的…

设计模式-行为型模式-中介者模式

中介者模式&#xff08;Mediator&#xff09;&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。[DP] 首先&#xff0c;我们定义一个Colleague接口&#xff0…

机器学习--循环神经网络(RNN)4

一、RNN的学习方式 如果要做学习&#xff0c;需要定义一个损失函数&#xff08;loss function&#xff09;来评估模型的好坏&#xff0c;选一个参数要让损失最小。 以槽填充为例&#xff0c;如上图所示&#xff0c;给定一些句子&#xff0c;给定一些标签&#xff0c;告诉机器…

基于Springboot的高校宣讲会管理系统。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校宣讲会管理系统。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

ECharts 简要介绍及简单实例代码

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 提供了丰富的图表类型和交互能力&#xff0c;使用户能够通过简单的配置生成各种各样的图表&#xff0c;包括但不限于折线图、柱状图、散点图、饼图、雷达图、…

【xv6操作系统】xv6 启动过程分析

一、调试用到的汇编代码 为了方便&#xff0c; Makefile 会创建.asm 文件&#xff0c;可以通过它来定位究竟是哪个指令导致了 bug。 可以看到&#xff0c; kernel 从 80000000 地址处开始执行&#xff0c;第二列为相应指令&#xff08;如 auipc&#xff09; 的 16 进制表示&a…

C++ 打印输出十六进制数 指定占位符前面填充0

C 打印十六进制数据&#xff0c;指定数据长度&#xff0c;前面不够时&#xff0c;补充0. 代码如下&#xff1a; #include <iostream> #include <iomanip> #include <cmath>using namespace std;int main() {unsigned int id 0xc01;unsigned int testCaseId…

解决虚拟机静态网址设置后还是变动的的问题

源头就是我的虚拟机静态网址设置好了以后但是网址还是会变动 这是我虚拟机的配置 这是出现的问题 然后我去把多余的ens33的文件都删了 然后还不行 后来按照这个图片进行了下 然后接解决了

string 底层模拟实现常用接口

目录 前言 什么是string? 为什么要学习使用string&#xff1f;string的优势&#xff1f; 因此&#xff0c;string类的成员变量也如图顺序表一样&#xff0c;如下图所示&#xff1a; 构造函数 拷贝构造 析构函数 size() 、capacity&#xff08;&#xff09; operato…