首页 > 编程语言 >UDP编程

UDP编程

时间:2023-06-09 21:22:39浏览次数:78  
标签:UDP 字节 family int 编程 地址 接字

字节序

概念:是指多字节数据的存储顺序

  • 小端格式:将低位字节数据存储在低地址(LSB)
  • 大端格式:将高位字节数据存储在低地址(MSB)

特点
1、网络协议指定了通讯字节序—大端
2、只有在多字节数据处理时才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
4、异构计算机之间通讯,需要转换自己的字节序为网络字节序

 

2.03字节序转换函数

 

host---主机字节序

network---网络字节序

 htonl函数:将32位主机字节序数据转换成网络字节序数据

 htons函数:将16位主机字节序数据转换成网络字节序数据

ntohl函数:将32位网络字节序数据转换成主机字节序数据

ntohs函数:将16位网络字节序数据转换成主机字节序数据

 

2.04 IP地址转换函数

IP地址人为识别为:字符串,在计算机中以整数识别

inet_pton:字符串格式转整型  inet_pton(int family,const char *strptr, void *addrptr);

  • family 协议族 选IPV4对应的宏AF_INET
  • strptr 点分十进制数串
  • addrptr 32位无符号整数的地址

inet_ntop:整型数据转字符串格式  inet_ntop(int family, const void *addrptr,char *strptr, size_t len);

  • family 协议族
  • addrptr 32位无符号整数
  • strptr 点分十进制数串
  • len strptr缓存区长度
inet_addr():字符串格式转整型数据  inet_addr()

inet_ntoa():整型数据转字符串格式 inet_ntoa()

2.05 UDP协议
面向无连接的用户数据报协议,在传输数据前不需要先建立连接;目地主机的运输层收到UDP报文后,不需要给出任何确认
UDP特点
1、相比TCP速度稍快些
2、简单的请求/应答应用程序可以使用UDP
3、对于海量数据传输不应该使用UDP
4、广播和多播应用必须使用UDP
UDP应用
DNS(域名解析)、NFS(网络文件系统)、RTP(流媒体)等、音视频通话

2.05网络编程接口socket

 2.06 UDP编程C/S架构流程图

 

 

2.4 UDP编程-发送、绑定、接收数据

2.3 UDP编程-创建套接字

2.3.1创建socket套接字

int socket(int family,int type,int protocol);
功能:
创建一个用于网络通信的socket套接字(描述符)
参数:
family:协议族(AF_INET、AF_INET6、PF_PACKET等)
//流式套接字 用于TCP通信 /报式套接字 用于UDP通信

type:套接字类(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW等)

protocol:协议类别(0、IPPROTO_TCP、IPPROTO_UDP等)
                /0自动指定协议

 

2.4.1 IPv4套接字地址结构

头文件:#include <netinet/in.h>
struct in_addr
{
    in_addr_t s_addr;//4字节
};
struct sockaddr_in//网络编程中经常使用的结构体
{
    sa_family_t sin_family;//协议族,2字节
    in_port_t sin_port;//端口号,2字节
    struct in_addr sin_addr;//IP地址,4字节
    char sin_zero[8]//填充,不起什么作用8字节
};
为了使不同格式地址能被传入套接字函数,地址须要强制转换成通用套接字地址结构
头文件:#include <netinet/in.h>
struct sockaddr//通用结构体
{
    sa_family_t sa_family;    // 2字节
    char sa_data[14]    // 14字节
};
、

 

 

fgets(char *str, int n, FILE *stream)函数

参数

  • str-- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n-- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream-- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

stdin

是标准输入,一般指键盘输入缓冲区里的东西

2.4.2 发送数据—sendto函数

ssize_t sendto(int sockfd,
               const void *buf,
               size_t nbytes,
               int flags,
               const struct sockaddr *to,        
               socklen_t addrlen);
功能:
向to结构体指针中指定的ip,发送UDP数据
参数:
sockfd:套接字
buf:    发送数据的地址
nbytes: 发送数据的大小

flags: 一般为0
to:    指向目的主机地址结构体的指针
addrlen:to所指向内容的长度

注意:
通过to和addrlen确定目的地址
可以发送0长度的UDP数据包
返回值:
成功:发送数据的字符数
失败: -1

 

2.4.6绑定 bind函数
UDP网络程序想要收取数据需什么条件?

  • 确定的ip地址
  • 确定的port

怎样完成上面的条件呢?

  • 接收端 使用bind函数,来完成地址结构与socket套接字的绑定,这样ip、port就固定了
  • 发送端 在sendto函数中指定接收端的ip、port,就可以发送数据了
int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
功能:
将本地协议地址与sockfd绑定

参数:
sockfd: socket套接字
myaddr: 指向特定协议的地址结构指针
addrlen:该地址结构的长度

返回值:
成功:返回0
失败:其他

 

2.4.8接收数据—recvfrom 函数

ssize_t recvfrom(int sockfd, void *buf,size_t nbytes,int flags,
                    struct sockaddr *from,socklen_t *addrlen);
功能:
接收UDP数据,并将源地址信息保存在from指向的结构中

参数:
sockfd:    套接字
buf:    接收数据缓冲区地址
nbytes: 接收数据缓冲区的大小
flags:    套接字标志(常为0)
from:    源地址结构体指针,用来保存数据的来源
addrlen: from所指内容的长度

注意:
通过from和addrlen参数存放数据来源信息
from和addrlen可以为NULL, 表示不保存数据来源
返回值:
成功:接收到的字符数
失败: -1

 

标签:UDP,字节,family,int,编程,地址,接字
From: https://www.cnblogs.com/gaishuobulao/p/17441829.html

相关文章

  • Python递归法计算棋盘上所有路径总奖品最大值(京东2016编程题)
    问题描述:假设有一个6x6的棋盘,每个格子里有一个奖品(每个奖品的价值在100到1000之间),现在要求从左上角开始到右下角结束,每次只能往右或往下走一个格子,所经过的格子里的奖品归自己所有。问最多能收集价值多少的奖品。思路:每个格子所在路径的总奖品最大值依赖于左边的格子或右边的格子。......
  • Python编写编程作业批量自动打分程序的思路与实现
    总体思路:把接口明确地告诉学生(本文后面的代码要求学生程序中必须有个函数叫做searchOnede),然后学生把Python程序文件(学号_姓名.py)以任何方式提交给老师,放到同一文件夹中。下面的代码首先由老师编写一个自己认为的最佳和最优实现,然后把学生的程序文件作为模块导入并调用其中的searchO......
  • Python标准库socketserver实现UDP协议时间服务器
    Python标准库socketserver进行了更高一级的封装,非常适合服务端代码的编写,本文通过改写时间服务器的案例来演示标准库socketserver的用法,更多案例最近会陆续推送。服务端代码: 客户端代码: 运行情况:   ......
  • Python趣味编程3则:李白买酒、猴子吃桃、宝塔上的琉璃灯
    1、李白买酒问题描述:李白街上走,提壶去买酒。遇店加一倍,见花喝一斗。店不相邻开,花不成双长。三遇店和花,喝光壶中酒。请问此壶中,原有多少酒?简单分析:题目中加一倍是指再购买和壶中酒同样数量的酒,喝一斗是指喝掉壶中的一斗酒。根据描述,李白应该是先后遇到了酒店、鲜花、酒店、鲜花、酒......
  • 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
    在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是继承Thread类、实现Runnable接口和使用线程池。但是,你们知道吗?其实在创建线程的过程中......
  • 实验六 实验6 turtle绘图与python库应用编程体验
    task1_1源代码:fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • 常规游戏编程指导规范 (zz)
       章节名:常规游戏编程指导规范   2012-03-2120:48:41鱼雷(左手程序右手诗)//z2012-4-1017:34:53PMIS21201.对你所做的工作进行备份    不备份的代价是巨大的,重新编写角色AI和冲突检测就是悲剧2.开始游戏项目时要进行良......
  • 简单网络编程--TCP SERVER 端
     一个服务器,接受客户连接,返回客户IP地址,并关闭连接。一个服务器程序的基本步骤:1.winsocklibrary的初始化2.创建socket3.服务器地址4.bind->listen5.等待客户连接accept6.处理客户接入7.关闭socket8.释放资源:winsocklibrary//SimpleTcpServe......
  • Java并发编程 interrupt()方法
    interrupt()用法打断正常运行的线程interrrupt()方法可以用来打断正在运行的线程,也可以打断sleep()、wait()、join()情况下的线程,但是这些情况下被打断线程的打断标记不同。importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.TimeUnit;@Slf4jpublicclassIn......
  • 第二节 操作系统和编程语言
    查看conda的配置:cat   .bashrc  在第一次配置后会生成这个隐藏文件。如果以前存在有这个文件,记得删除。condaconfig--getchannels   展示自己配置的源condaconfig--addchannels     添加源 conda导出环境,导入环境condaenv......