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

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录

一、网络编程--OSI模型

二、网络编程--TCP/IP模型

三、网络接口

四、UDP网络相关编程及主要函数

​编辑​编辑 UDP的特征

socke函数

bind函数

recvfrom函数(接收函数)

sendto函数(发送函数)

五、网络编程之 UDP  用户数据报 

1、特性: 无链接  不可靠  大数据   

2、框架: C/S模式 

3、代码示例

一、网络编程--OSI模型

二、网络编程--TCP/IP模型

三、网络接口

四、UDP网络相关编程及主要函数

 
UDP的特征

服务端:提供网络服务

客户端:使用网络服务

在网络程序,是客户端找服务器,服务器不能找客户端,故服务端需使用bind来绑定端口号;

socke函数

 服务器端:

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

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

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                                       PF_UNIX == AF_UNIX ==>单机程序
           type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
                SOCK_DGRAM   用户数据报套接字===>UDP
                SOCK_RAW     原始套接字  ===》IP
      protocol 协议 ==》0 表示自动适应应用层协议。(前面已经描述清楚,TCP\UDP都填0)

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

bind函数

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

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

      注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族
          u_short           sin_port;   ///地址端口,一般建议值大于50000,使用htons(host to net short),进行地址转换(将一个无符号短整型数值转换为网络字节序,即大端模式)
          struct in_addr  sin_addr;   ///地址IP,使用函数inet_addr(192.168.116.130);将字符串(小端)转为大端
          char               sin_zero[8]; 占位
      };

      struct in_addr
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功 0,失败  -1;

recvfrom函数(接收函数)

ssize_t recvfrom(int sockfd, void *buf, size_t len,             int flags,                          
                              收到buf     大小        一般默认为0 ,无人发送时阻塞
struct sockaddr *src_addr, socklen_t *addrlen);
    对方地址                   大小:int len = sizeof(cli);
                                    &len

接收函数:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                  struct sockaddr *src_addr, socklen_t *addrlen);

功能:用于UDP协议中获取对方发送的数据。
参数:sockfd 本地的套接字id
      buff   要存储数据的内存区,一般是数组或者动态内存。
      len    要获取的数据长度,一般是buff的大小。
      flags  获取方式,0 阻塞

      src_addr 可选,表示对方的地址信息结构体,
                  如果为NULL,表示不关心对方地址。
      addrlen  对方地址信息结构体大小。
                  如果对方地址是NULL,则该值也为NULL。
返回值:成功 接收到的数据长度
        失败  -1;

sendto函数(发送函数)

ssize_t sendto(int sockfd, const char *buf, size_t len, int flags, 
                            发生buf内容
const struct sockaddr *dest_addr, socklen_t addrlen);
发给谁

发送函数:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
             const struct sockaddr *dest_addr, socklen_t addrlen);

功能:用于UDP协议中向对方发送数据。
参数:sockfd  本地的套接字id
      buff    本地的数据存储,一般是要发送的数据。
      len     要发送的数据长度
      flags   要发送数据方式,0 表示阻塞发送。

      dest_addr: 必选,表示要发送到的目标主机信息结构体。
      addrlen :目标地址长度。

返回值:成功  发送的数据长度, 失败   -1;

注意:对于客户端,ser内容保留,获取iP地址;
当谁回应是确定的,recvfrom的地址为null,大小也为null;
若完成,关闭套接字,close(); 

五、网络编程之 UDP  用户数据报 

1、特性: 无链接  不可靠  大数据   

2、框架: C/S模式 

   server:socket() ===>bind()===>recvfrom()===>close()
   client:socket() ===>bind()===>sendto() ===>close()

注意:socket()的参数需要调整。

      socket(PF_INET,SOCK_DGRAM,0);

      bind() 客户端是可选的,服务器端是比选的。

3、代码示例

服务端: 

 客户端:

http://www.xdnf.cn/news/12973.html

相关文章:

  • NLP-数据集
  • wifi改ip地址有什么用?wifi改ip地址怎么改
  • LeetCode - 3. 无重复字符的最长子串
  • 无源一阶低通电路噪声如何计算
  • 音乐“穿梭机”AudioRelay,让你的音频“无缝对接”
  • push [特殊字符] present
  • 深入解析 Qwen3 基础模型:架构设计与技术创新
  • 第2课 SiC MOSFET与 Si IGBT 静态特性对比
  • 从0开始学习R语言--Day20--Wilcoxon秩和检验
  • 组件库实战-基建思路
  • Docker拉取MySQL后数据库连接失败的解决方案
  • P3 QT项目----记事本(3.8)
  • Qt的学习(二)
  • 用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
  • HDMI 显示器热插拔对应显示应用启停测试
  • 高分辨率图像合成归一化流扩展
  • 02.运算符
  • 使用Spring Cloud Stream 模拟生产者消费者group destination的介绍(整合rabbitMQ)
  • c++默认类模板参数
  • K8S中的PV、PVC和StorageClass
  • 【C++】std::bind和std::placeholders
  • c# 局部函数 定义、功能与示例
  • 「Java基本语法」变量的使用
  • redis--黑马点评--Redisson快速入门
  • 自动化过程中,如何定位一闪而过的toast?
  • 【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破
  • Xen Server服务器释放磁盘空间
  • 什么是CRM客户管理系统?怎样的企业需要用CRM客户管理系统?
  • SQL 注入:JDO与Hibernate
  • @Lazy原理与实战