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

我要成为嵌入式高手之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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

开展庆2024年“三八”国际妇女节系列纪念活动怎样向媒体投稿?

为了向媒体投稿,庆祝2024年“三八”国际妇女节系列纪念活动,你可以遵循以下步骤: 策划与准备: 确定纪念活动的主题和目标,例如提升女性权益、表彰女性成就、促进性别平等。 策划一系列活动,如研讨会、表彰仪式、展览、讲座等,确保内容丰富多样。 准备相关的背景资料、活动介…

PyTorch搭建LeNet神经网络

函数的参数 1、PyTorch Tensor的通道排序 [batch, channel, height, width] batch: 要处理的一批图像的个数 channel: 通道数&#xff08;一般是R G B 三个通道&#xff09; height: 图像的高度 width: 图像的宽度 2.Conv 2d 卷积层的参数 [in_channels, out_channels, ke…

从零开始学习Netty - 学习笔记 -Netty入门【自定义编码器解码器】

自定义编码器解码器 通过一个简单案例&#xff0c;我们自己去实现一个编码器 和解码器 实现思路 编码器&#xff08;Encoder&#xff09;实现&#xff1a; 在编码器中&#xff0c;实现了 ByteToMessageCodec<Message> 类&#xff0c;并覆盖了 encode() 方法来处理消息的编…

【HarmonyOS】Dev Eco Studio4.0安装教程

目录 下载安装开发工具配置 下载 Dev Eco Studio4.0下载连接→https://developer.huawei.com/consumer/cn/next/deveco-studio/ 安装 点击Next 选择安装目录。点击Next 勾选创建桌面快捷方式和环境变量&#xff0c;点击Next 点击Install&#xff0c;安装 等待安装 选…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

做分析用什么工具

做分析用什么工具 导读 数据分析是数据辅助决策的最后一公里&#xff0c;是最终的数据可视化展示与探索分析的部分&#xff0c;选择使用最适合的数据展示方式&#xff0c;可以帮助分析人员大大提升分析效率。 问题&#xff1a; ● 纠结选择哪个工具 ● 纠结从哪里学起&#x…

Java异常的介绍与处理

一、异常与错误(Error)的区别&#xff1a; 异常&#xff08;Exception&#xff09;和错误&#xff08;Error&#xff09;都是指程序执行过程中的问题&#xff0c;但它们之间存在一些重要的区别。 异常&#xff08;Exception&#xff09;&#xff1a; 异常表示程序在执行期间可能…

Memcached介绍和详解

Memcached介绍 Memcached是一个高性能的分布式内存对象缓存系统&#xff0c;它通过在内存中缓存数据来减少数据库负载&#xff0c;加快动态Web应用程序的响应速度。 以下是Memcached的一些关键特点和作用&#xff1a; 分布式缓存&#xff1a;Memcached是分布式的&#xff0c;不…

Android高级工程师面试实战,三幅图给你弄懂EventBus核心原理

阿里技术一面-35min 自我介绍 Android 有没有遇到OOM问题(有遇到内存泄漏问题)Handler机制ThreadLocalActivity启动到加载View过程View绘制过程LinearLayout (wrap_content) & TextView (match_parent) 最终结果???OKHttp(1. 为什么选择它&#xff1f; 2. 性能了解不…

阿里云服务器几核几G怎么选择?带宽多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Java 学习和实践笔记(27):Object类的基本特性、toString方法以及IDEA的部分快捷键介绍

Object类基本特性&#xff1a; 1.Object类是所有类的父类&#xff0c;所有的Java对象都拥有Object类的属性和方法&#xff08;注意拥有并不等于可以直接使用&#xff09; 2.如果在类的声明中未使用extends&#xff0c;则默认继承Object类。 toString方法是Object类里定义的一个…

Word中的文档网格线与行距问题

在使用Word编辑文档时&#xff0c;经常会发生以下动图展示的这种情况&#xff1a; 上面的动图里&#xff0c;将文字大小放大到某个字号时&#xff0c;单倍行距的间距突然增加很多。造成这种情况的原因是文档中定义了网格线&#xff0c;并且设置了对齐到网格线。如果取消文档中…

[清爽快捷] Ubuntu上多个版本的cuda切换

做到真正的一行代码搞定&#xff0c;只需要修改对应软链接&#xff0c;就可以轻松实现快捷切换cuda 查看已安装的cuda版本有哪些 一般如果我们都是使用默认位置安装cuda的话&#xff0c;那么其安装路径都是/usr/local。如果要查看该目录下已经安装有哪些版本的cuda&#xff0c…

Git分布式管理-头歌实验本地版本库

一、本地版本库创建 任务描述 本地Git操作三部曲是“修改-添加-提交”&#xff0c;即先要在本地仓库进行添加、删除或编辑等修改&#xff0c;然后将本地所做的修改添加至暂存区。添加至暂存区的这些本地修改&#xff0c;并未提交到本地仓库&#xff0c;需要执行提交命令才能将暂…

SPSS26安装后无法启动,提示:应用程序的并行配置不正确

以下的解决方法供参考&#xff1a; 1、安装jdk并配置 2、 找到安装目录\Statistics\26\VC9下的vcredist_x64.exe&#xff0c;打开安装并选择“repair”&#xff0c;安装完成后重启&#xff0c;一般可以成功。 3、若还不行&#xff0c;安装较新的C运行库&#xff0c;再试试。 …

勒索病毒攻击新玩法,先盗数据再勒索

2019年是勒索病毒团伙针对企业进行勒索攻击爆发的一年&#xff0c;全球多个国家的政府组织机构、企事业单位都成为了勒索病毒团伙攻击的目标&#xff0c;勒索病毒也成为了网络安全最大的网络安全威胁&#xff0c;新的勒索病毒不断涌现&#xff0c;旧的勒索病毒不断变种&#xf…

1.1 深度学习和神经网络

首先要说的是&#xff1a;深度学习的内容&#xff0c;真的不难。你要坚持下去。 神经网络 这就是一个神经网络。里面的白色圆圈就是神经元。神经元是其中最小的单位。 神经网络 单层神经网络&#xff1a; 感知机 &#xff08;双层神经网络&#xff09; 全连接层&#xff1a; …

DHCP自动获取IP地址实验(华为)

思科设备参考&#xff1a;DHCP自动获取IP地址实验&#xff08;思科&#xff09; 一&#xff0c;实验目的 路由器搭载DHCP&#xff0c;让PC通过DHCP自动获取IP地址 二&#xff0c;不划分vlan--全局地址池 实验拓扑 配置命令 Router <Huawei>system-view [Huawei]ip po…

十三、类的继承、访问级别

类的继承与访问控制 类的继承 使用sealed修饰的类&#xff0c;是私有类&#xff0c;不能作为基类使用C#中一个类&#xff0c;只能有一个父类&#xff0c;但是可以实现多个接口子类的访问级别不能超过父类的访问级别 using System; using System.Collections.Generic; using S…