十九、socket套接字编程(一)——UDP

news2024/10/6 4:07:55

文章目录

  • 一、socket套接字编程接口
    • (一)socket头文件
    • (二)socket 常见API(套接字编程接口)
      • 1. 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器 )
      • 2.绑定网络信息 (TCP/UDP, 服务器 )
      • 3.开始监听 socket (TCP, 服务器 )
      • 4.接收请求 (TCP, 服务器 )
      • 5.建立连接 (TCP, 客户端 )
    • (三)sockaddr结构(套接字的地址结构类型定义)
    • (四)一些相关函数
      • 1.inet_ntoa
      • 2.地址转换函数
      • 2.网络服务 recvfrom 与 sendto
        • (1)udp特有的 recvfrom读取套接字中的信息
        • (2)sendto向套接字发送信息
  • 二、简单的UDP网络程序
    • (一)实现一个简单的英译汉的功能
      • 1.服务器
      • 2.客户端

一、socket套接字编程接口

(一)socket头文件

man socket,man htons,man inet_ addr查看所有头文件
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

(二)socket 常见API(套接字编程接口)

1. 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器 )

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

domain:socket网络通信的域——网络通信 (AF_INET /PF_INET )(或 本地通信
(AF_UNIX))。现在只用AF_INET 网络通信(有的地方把AF_INET写成PF_INET也是正确的)
type:套接字类型——决定了我们通信的时候对应的报文类型(流式 / 用户数据报式)

    流式套接:SOCK_STREAM ——用于TCP协议

    用户数据报式套接:SOCK_DGRAM ——用于UDP协议

protocol:协议类型——网络应用中设置为0。(因为AF_INET+SOCK_STREAM—默认是TCP套接字;AF_INET+SOCK_DGRAM—默认是UDP套接字)

返回值:成功返回文件描述符(套接字描述符),错误返回-1并设置错误码(套接字类型本质就是文件描述符)

2.绑定网络信息 (TCP/UDP, 服务器 )

nt bind(int socket, const struct sockaddr *address,socklen_t address_len);

sockfd:套接字这个文件描述符。addr:传入我们自己创建的信息 struct sockaddr_in local
的地址,然后把它强转成struct
sockaddr类型结构体,内部会自动识别是什么类型的套接字做绑定。
addrlen:sockaddr类型结构体 的大小

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

例如:if (bind(sockfd_, (const struct sockaddr *)&local, sizeof(local)) == -1)

3.开始监听 socket (TCP, 服务器 )

int listen(int socket, int backlog);

4.接收请求 (TCP, 服务器 )

int accept(int socket, struct sockaddr* address,socklen_t* address_len);

5.建立连接 (TCP, 客户端 )

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

(三)sockaddr结构(套接字的地址结构类型定义)

socket API是一层抽象的网络编程接口 , 适用于各种底层网络协议 , 如 IPv4 、 IPv6, 以及后面要讲的 UNIX Domain Socket. 然而 , 各种网络协议的地址格式并不相同。
两个地址结构类型:

  • struct sockaddr_ in——网络套接字,用于网络通信;
  • struct sockaddr_ un——域间套接字,用于UNIX本地通信;
  • IPv4和IPv6的地址格式定义在 netinet/in.h 中,IPv4地址用 sockaddr_in 结构体表示,包括16位地址类型,
    16位端口号和32位IP地址。
  • IPv4、 IPv6地址类型分别定义为常数AF_INET、AF_INET6。这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。
  • socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in;这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX DomainSocket各种类型的sockaddr结构体指针做为参数;

在这里插入图片描述
sockaddr 结构
在这里插入图片描述
sockaddr_in 结构
在这里插入图片描述
虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP地址。
in_addr结构
在这里插入图片描述

(四)一些相关函数

1.inet_ntoa

char *inet_ntoa(struct in_addr in);4字节IP地址转为字符串风格的IP地址并返回。

返回值:inet_ntoa 这个函数返回了一个 char*(错误返回nullptr), 很显然是这个函数自己在内部为我们申请了一块内存来保存 ip的结果。
inet_ntoa 函数 把这个返回结果放到了静态存储区static char buffer[] , 这个时候不需要我们手动进行释放。
注意:这类函数在转变IP风格时都会自动进行主机字节序和网络字节序之间的转换。

例子: std::string peerIp = inet_ntoa(peer.sin_addr); //拿到了对方的IP
在这里插入图片描述
因为inet_ntoa把结果放到自己内部的一个静态存储区, 这样第二次调用时的结果会覆盖掉上一次的结果。

    思考: 如果有多个线程调用 inet_ntoa, 是否会出现异常情况呢 ?——不一定
    在APUE 中 , 明确提出 inet_ntoa 不是线程安全的函数 ;
    但是在centos7 上测试 , 并没有出现问题 , 可能内部的实现加了互斥锁 ;
    自己写程序验证一下在自己的机器上inet_ntoa 是否会出现多线程的问题 ;
    在多线程环境下, 推荐使用 inet_ntop, 这个函数由调用者提供一个缓冲区保存结果 , 可以规避线程安全问题;

2.地址转换函数

基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位的IP 地址,但是我们通常用点分十进制的字符串表示IP 地址,以下函数可以在字符串表示和in_addr表示之间转换;
字符串转in_addr的函数:
在这里插入图片描述

in_addr转字符串的函数:
在这里插入图片描述

其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr,因此函数接口是void*addrptr!

2.网络服务 recvfrom 与 sendto

(1)udp特有的 recvfrom读取套接字中的信息

 man recvfrom

在这里插入图片描述

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
  • 从特定套接字 sockfd中读取数据到缓冲区buf中,buf大小为len,flags设为0——阻塞式读取

  • src_addr:(输出型参数)当服务器读取客户端发送的消息时——哪个客户端给你发的消息,就把这个客户端套接字信息存入src_addr中。(src_addr的类型是套接字类型指针struct sockaddr*,传入的网络套接字类型struct sockaddr_in需要强转成此类型指针 struct sockaddr。)

  • addrlen:(输入输出型参数)客户端这个缓冲区大小。(socklen_t就是unsigned int)

  • 返回值:返回读到的字节数,错误就返回-1错误码被设置

当客户端使用recvfrom读取服务器返回发送的消息时——src_addr和addrlen没意义,但是还是要定义一个套接字类型结构体添上占位。

(2)sendto向套接字发送信息

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

通过客户端的指定套接字sockfd,发送buf中的数据,buf的大小是len,flags=0 默认阻塞式发送。

  • dest_addr:(输入型参数)向哪个主机发消息,套接字类型指针struct sockaddr*,传入的网络套接字类型struct sockaddr需要强转成此类型指针 struct sockaddr

  • addrlen:(输入型参数)主机这个缓冲区大小。(socklen t就是unsigned int)

  • 返回值:返回读到的字节数,错误就返回-1错误码被设置

(首次调用sendto函数的时候,我们的client会自动bind自己的ip和port)

二、简单的UDP网络程序

(一)实现一个简单的英译汉的功能

1.服务器

2.客户端

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

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

相关文章

如何使用 OCI Artifacts、ORAS 和 Docker Hub 标准化软件交付

Docker Hub 是最著名的用于分发和共享容器映像的注册表。不过, Docker Hub 和其他符合 OCI 的注册表现在可以做的不仅仅是容器镜像。ORAS (OCI 注册表作为存储)项目将注册表转换为通用工件存储,能够发布与您的应用程序相关的任何资产。 在本文中,您将了解 ORAS 是什么、它…

echarts-热力图+高亮+轨迹

var mapData [{name: "北京",devicesCount: 100, //总数value: 10, //使用个数},{name: "天津",devicesCount: 50,value: 20,},{name: "上海",devicesCount: 80,value: 30,},{name: "重庆",devicesCount: 90,value: 40,},{name: "…

HOT28-两数相加

leetcode原题链接&#xff1a;两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

搭建mysql集群(Windows环境)

1、MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性&#xff0c;增强了安全性&#xff0c;使得单个MySQL服务器故障不会对系统产生巨大的负面效应&#xff0c;系统的稳定性得到保障。 MySQL群集需要有一组计算机&#xff0c;每台计算机的…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

COMSOL基于随机Voronoi骨架的三维多孔材料泡沫铝骨小梁模型力学分析

力学模型 模型计算为圆柱体试件轴压模型&#xff0c;在轴向荷载作用下应力分布的计算。 几何生成 采用CAD Voronoi3D插件在AutoCAD内直接生成三维Voronoi&#xff0c;其计算参数如下&#xff1a; 模型生成后删除晶格部件&#xff0c;并对晶粒进行一步平滑处理&#xff1a…

Centos7系统,虚拟机断电后启动报错:You might want to save “/run/initramfs/rdsosreport.txt“

虚拟机突然断电造成centos8系统无法启动 Linux报You might want to save “/run/initramfs/rdsosreport.txt“ to a USB stick or /boot after mounting 1.解决方法&#xff1a; 大家可以用umr查看到自己装的镜像对应的以-root结尾的文件是哪个。因为大家装的镜像不同&#x…

多语言翻译node工具

多语言 i18n 翻译node工具 介绍 本文是为了方便使用 i18n的翻译工具&#xff0c;实现把excel的内容追加或更改到项目中的多语言文件中主要文件为 index.js 、test.txt 和 dist 文件夹内所有内容&#xff08;dist为项目中需要翻译的多语言文件&#xff0c;下面有例子&#xff…

有源、无源晶振的区别

在PCB设计中&#xff0c;晶振&#xff08;晶体振荡器&#xff09;是非常重要的电子元器件&#xff0c;相信大部分的PCB工程师对它都不会陌生。而对于有源晶振与无源晶振&#xff0c;很多人却是“傻傻分不清楚”。 我们知道&#xff0c;电子线路中的晶体振荡器分为无源晶振和有源…

TI AM64x工业核心板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 硬件资源 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的P…

如何配置git的.bashrc文件

1、进入到.git文件里&#xff1a;新建一个.bashrc文件 2、打开.bashrc文件添加配置信息&#xff1a; 代码&#xff1a; #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文件及基本信息 alias llls -al …

Git入门(职场必备工具)

目录 一、git在职场中的重要性 1.1git是什么&#xff1f; 1.2什么是版本控制 1.3学习这个工具的作用和目的 二、Git开发必备技能及其应用场景 2.1 如何用Git对一个目录进行版本控制流程&#xff1f; 三、Git 如何上传和提取代码 3.1 克隆远端库到本地库 3.2 将本地库推…

硬件学习件Cadence day12 PCB设计中打地孔与地孔设计,PCB 后期处理,钻孔文件导出

1. 制作 过地孔的焊盘 &#xff08;两种方法&#xff09;&#xff08;又叫制作盲埋孔&#xff09; 1.1 制作热风焊盘 &#xff08;之前的教程有&#xff0c;现在只给数据&#xff09; 1.2 第一种 allegro 外部 焊盘软件制作 1.2.1 打开软件 1.2.2 制作焊盘&#xff0c;查看…

使用Divi创建在线学习管理 (LMS) 网站

我喜欢在线学习课程。开始一个设计良好、组织良好、内容丰富的线上课程是有道理的。如果做得好&#xff0c;这些线上课程可以让您充满成就感。但是学习一门很棒的线上课程和创建一个线上课程是两种完全不同的体验。根据我的经验&#xff0c;创建学习管理/线上课程网站可能是一个…

自动刷新工具--可以自动编辑安居客房源信息

本工具可以自动刷新安居客的房源信息&#xff0c;不是爬虫&#xff0c;就是一款解放劳动力的RPA工具 使用方法&#xff1a; 1. 首先输入要自动刷新的房源id 2.点击 开始执行 如果需要免密登陆&#xff0c;需要在个人中心填上anjuke的账密 定时执行 声明&#xff1a;此工具只是…

kafka入门,数据可靠性(八)

1、回顾发送流程 2、ACK应答原理 0&#xff1a;生斥责发送过来的数据&#xff0c;不需要等数据落盘应答&#xff08;数据可靠性分析&#xff1a;丢数&#xff09; 1&#xff1a;生产者发送过来的数据&#xff0c;leader收到数据后应答&#xff08;数据可靠性分析&#xff1a;丢…

前端网络基础

目录 网络分层模型OSI七层模型TCP/IP四层模型TCP/IP五层模型 HTTP传递消息的模式传递消息的格式响应码 URL用户代理/user agent自动发送请求自动解析响应 AJAXXHRFetch 跨域同源与异源网络通信中的跨域浏览器对跨域的限制CORS简单请求对简单请求的验证 预检请求对预检请求的验证…

第4讲:使用ajax技术实现菜单展开或隐藏功能(xml数据)

使用ajax技术实现点击菜单时&#xff0c;展开当前子菜单列表&#xff0c;隐藏其他子菜单功能&#xff1b;前端使用静态html页面生成一级菜单&#xff0c;当点击某个菜单时&#xff0c;发送数据到后端(jsp文件)&#xff0c;利用responseXML返回xml格式文件&#xff0c;刷新二级菜…

机器学习李宏毅学习笔记35

文章目录 前言一、Meta learning1.第一步2.第二步3.第三步 二、machine learning 和 meta learning区别总结 前言 Meta learning元学习&#xff1a;学习如何学习 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Meta learning 学习这件事也是一个…

webassembly安装python环境问题

在部署emscripten过程中&#xff0c;步骤emsdk install latest报错&#xff1a; 本以为是多个版本或版本不对应导致的&#xff0c;但是卸载所有版本并安装python3.9之后还是不行。 现象就是在cmd中使用python --version不报错也无版本显示。 一波bing~之后找到了结果(PYTHON|…