有名信号量、网络协议模型、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协议族),套接字类型:数据报套接字;默认0if (-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.mzph.cn/news/737905.shtml

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

相关文章

伊芙丽签约实在智能,实在Agent数字员工助力品牌效能飙升

近日&#xff0c;国内知名时尚女装品牌伊芙丽与实在智能达成合作&#xff0c;引入业内领先的平台级自动化产品实在Agent数字员工——取数宝&#xff0c;自动获取天猫、淘宝、抖音等线上平台营销数据&#xff0c;开启全域化营销的“提效之旅”。 实在Agent智能体 伊芙丽集团成立…

java agent技术的注入利用与避坑点

什么是Java agent技术&#xff1f; Java代理&#xff08;Java agent&#xff09;是一种Java技术&#xff0c;它允许开发人员在运行时以某种方式修改或增强Java应用程序的行为。Java代理通过在Java虚拟机&#xff08;JVM&#xff09;启动时以"代理"&#xff08;agent…

CPU飙升和OOM排查思路

CPU使用率高和OOM&#xff08;Out of Memory&#xff09;异常是两个不同但可能相互关联的问题。下面分别对这两个问题的排查流程进行详细说明&#xff1a; CPU使用率高排查流程 实时监控与初步定位&#xff1a; 使用系统工具&#xff0c;如Linux中的top命令查看整体CPU使用情况…

分发平台如何支持热更

随着移动应用程序和游戏的迅猛发展&#xff0c;用户对于获得最新功能和修复bug的期望也越来越高。为了满足这一需求&#xff0c;现代的分发平台越来越注重在应用程序或游戏发布后能够支持热更新的功能。热更新是指通过网络直接获取更新并应用到用户设备上&#xff0c;而无需重新…

云原生周刊:Helm Charts 深入探究 | 2024.3.11

开源项目推荐 Glasskube Glasskube 提供了一个用于 Kubernetes 的缺失的包管理器。它具有图形用户界面(GUI)和命令行界面(CLI)。Glasskube 包是具备依赖感知、GitOps 准备和可以通过中央公共包仓库自动更新的特性。 imgpkg imgpkg&#xff08;发音为&#xff1a;"imag…

WPF 该线程是用不接受参数的 ThreadStart 委托创建的。

创建无参数线程是无法发去传递参数的&#xff0c;需要把 《 thread.Start(“张三”); 》改为《 thread.Start(); 》 把参数去掉就可以了。 public RegisterWindow(){InitializeComponent();//无参数线程Thread thread new Thread(pageLoad);thread.IsBackground true;//thr…

ubuntu 23开机界面美化教程

效果 方法 GRUB开机界面美化 从上述网站中&#xff0c;查找GRUB Themes分类&#xff0c;并下载GRUB主题包&#xff08;tar.gz格式&#xff09;&#xff0c;如CyberSynchro.tar.gz&#xff1b; 解压下载得到的压缩包&#xff0c;得到CyberSynchro&#xff1b; 将CyberSynchro…

leetcode 热题 100_轮转数组

题解一&#xff1a; 新数组存储&#xff1a;另外用一个数组存储移动后的结果&#xff0c;再复制回原数组。 class Solution {public void rotate(int[] nums, int k) {int[] result new int[nums.length];for (int i 0; i < nums.length; i) {result[(i k) % nums.lengt…

llama factory 是如何加载数据集 通过对数据集加载的代码的理解编写自定义数据集训练代码

第一层从训练代码追踪到以下代码 def get_dataset(tokenizer: "PreTrainedTokenizer",model_args: "ModelArguments",data_args: "DataArguments",training_args: "Seq2SeqTrainingArguments",stage: Literal["pt", "…

Python自动化测试之Python简介及环境安装配置

经过持续的"内卷"&#xff0c;编程变成测试工程师不可或缺的一项能力&#xff0c;掌握了一门编程语言,使你在面试过程中更有竞争力&#xff0c;是升值加薪的利器。 一、Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初&#xff0c;在荷兰国家数…

springboot同时接收json数据和 MultipartFile

首先测试接口发送方式。。。。。注意发送结构&#xff01; 后端接收RequestPart SaCheckPermission("system:records:add")Log(title "【用药纪录】", businessType BusinessType.INSERT)RepeatSubmit()PostMapping()public R<Void> add( RequestP…

大模型GPU监控之nvitop

背景 在进行大模型训练的时候&#xff0c;往往需要用到多张GPU卡&#xff0c;如何实现多卡的管理和监控&#xff0c;这是一个比较好的话题&#xff0c;下面介绍一个小工具。 安装nvitop pip install nvitop nvitop -m full 监控界面

抖音视频提取gif怎么做?分分钟帮你生成gif

通过将视频转换成gif动图的方式能够方便的在各种平台上分享、传播。相较于视频文件&#xff0c;gif动图的体积更小&#xff0c;传播起来更方便&#xff0c;能够吸引大众的注意力。下面&#xff0c;就来给大家分享一个gif图片制作&#xff08;https://www.gif.cn/&#xff09;的…

如何隐藏前端项目编译后的.map文件

需求来源&#xff1a; 1、不想让用户在客户端看到源码。 2、应对安全扫描&#xff0c;给客户交付的项目.map被扫描出风险&#xff0c;确保交付。 在Web开发中&#xff0c;通常会使用Source Map文件&#xff08;.map文件&#xff09;来将压缩后的JavaScript或CSS代码映射回原始…

分布式架构下 网络通信的底层实现原理(三)

阻塞通信 Java中经常会使用Scoket套接字来实现网通信&#xff0c; 举个栗子&#xff1a; import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class testSocket {public static void main(String[] args) throws IOException {final int DEFAU…

web自动化测试框架都是有哪些?

Web自动化测试框架主要有以下几种&#xff1a; 1.Selenium&#xff1a;轻量级的Web自动化测试框架&#xff0c;支持多种Web浏览器和语言的集成。Selenium提供了一个IDE来录制和运行自动化测试脚本&#xff0c;还提供了WebDriver&#xff0c;可以通过编程语言编写自动化测试脚本…

【鸿蒙 HarmonyOS 4.0】Web组件

一、介绍 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 二、加载网页 2.1、加载在线网页 Web组件的使用非常简单&#xff0c;只需要在Page目录下的ArkTS文件中创建一个…

5款好用的AI办公软件,一键轻松制作PPT、视频,提升工作效率!

众所周知&#xff0c;AI 人工智能技术已渗透到生活的方方面面&#xff0c;无论是很多人早已用上的智能音箱、语音助手&#xff0c;还是新近诞生的各种 AI 软件工具&#xff0c;背后都离不开 AI 人工智能技术的加持。 对于各类新生的 AI 软件工具&#xff0c;人们很容易「选边站…

Go的安装

一. 下载地址 Go官方下载地址&#xff1a;https://golang.org/dl/ Go中文网&#xff1a;https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量&#xff0c;用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…

部署 Web 项目到Linux上

目录 环境配置 构建项目 ​编辑 数据准备 运行并查看日志 杀掉进程 把程序安装到生产环境上, 这个过程称为 "部署"&#xff0c;也叫 "上线"。一旦程序部署成功, 那么这个程序就能被外网中千千万万的普通用户访问到。 环境配置 程序配置文件修改 实…