Liunx 套接字编程(1)UDP协议的操作且实现一个UDP通信客户端

news2024/12/24 10:13:59

1.套接字编程

主要讲解的就是如何编写一个网络通信程序

1.网络通信的数据中都会包含一个完整的五元组: sip,sport,dip,dport,protocol(源端IP,源端端口,对端IP,对端端口,协议)

五元组完整的描述了数据从哪来,到哪去,用的是什么数据格式。

2.网络通信,通常讨论的是两个主机进程之间的通信:客户端&服务端

客户端网络通信程序:通常指的是用户使用的一端

服务端网络通信程序: 通常指的是网络应用提供商提供服务的一端程序

客户端永远都是首先发起请求的一端(因为服务端是不知道客户端地址的(动态地址分配技术--谁上网给谁分配地址)

但是网络应用服务提供商,开发的客户端程序中都写入了服务器端的地址和端口,因此客户端是知道服务端地址的。还有一种原因就是,只有客户发送了请求,服务端才能提供对应的服务

2.TCP和UDP协议

套接字:socket的翻译,通常表示的是系统提供给程序员实现网络通信的一套接口

因此套接字编程学习的其实就是套接字接口的使用,通过这套接口完成网络通信程序的开发我们所讲解的套接字编程,主要是两个协议的通信程序编写: 传输层的TCP和UDP协议

TCP协议和UDP协议的区别:

联系:都是传输层协议

tcp协议: 传输控制协议--提供的是面向连接,可靠,基于字节流的数据传输

面向连接:通信前先要确定双方是否具有数据收发的能力

可靠传输:通过大量的一些控制机制,保证数据能够安全(有序且完整,一致)到达对端

字节流:没有传输大小限制,传输比较灵活的一种传输方式

tcp适用于安全要求大于实时要求的场景,比如文件传输

udp协议: 用户数据报协议--提供的是无连接,不可靠,基于数据包的数据传输

无连接:需要建立连接,只要知道对方的地址,就可以直接发送数据

不可靠:只要数据发送出去了就行,不管是否能够到达对端

数据报:有最大大小限制,且传输交付有大小限制的一种传输方式

因为没有大量的控制机制,因此传输速度快,因此适用于实时性要求大于安全性要求的场景,比如视频传输,音频传输

3.UDP协议

UDP协议通信程序的编写

UDP通信两端流程:

A.操作接口

  1. 创建套接字

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

2.为套接字绑定地址信息

int bind(int sockfd,  struct sockaddr*addr, socklen_len);

sockfd : socket返回的套接字描述符

addr: 要绑定的地址信息(不同地址域类型,有不同的地址结构)

因此IPv4通信定义 struct socketadddr_in结构即可

进行bind的时候,进行类型强转,这样可以实现一个接口绑定多种不同的地址结构

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

bind接口为套接字绑定的地址:

使用ifconfig指令绑定地址

推荐绑定10000以上

3.发送数据

ssize_t sendto(int sockfd, void* buf, size_t dlen, int flag, struct sockaddr* peer, socklen_t alen);

peer设置的谁,就发给谁

4.接收数据

ssize_t recvfrom(int sockfd, void* buf, size_t dlen, int flag, struct sockaddr* peer, socklen_t *alen)

凡是涉及到获取地址信息的操作,地址信息长度基本都是 socklen_t*

peer用于获取地址信息,peer中存的是谁,数据就是谁发给我的,peer这个参数在recvfrom这函数中设置的

返回值:成功返回实际接收到的数据长度,失败返回-1

5.关闭套接字,释放资源

int close(int fd);

B.字节序相关接口

下面这个几个接口已经进行了主机字节序的判断,不需要担心自己的主机字节序

代码实现、逐步注释

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc, char *argv[])
{
//下面几行,要求程序运行需要输入两个参数,一个为IP地址,一个为端口,加上程序命令本身,共三个参数,argc就表示参数,不等于3就给你提示,需要输入的东西 
    if(argc != 3)
    {
        printf("./udp_srv 192.168.2.2 9000\n");
        return -1;
    }
    uint16_t port = atoi(argv[2]);//atoi为字符串转数字,就是9000转赋值port
    char *ip =arg[1];//就是地址192.168.2.2

//1.创建套接字
//AF_INET为IPV4地址域类型,SOCK_DGRAM数据报套接字类型--提供数据报传输服务,
//IPPROTO_UDP--表示使用UDP协议
    int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(sockfd < 0)
    {
        perror("socket error");
        retrun -1;
    }

//2.为套接字绑定地址信息
    struct sockaddr_in addr;//定义一个ipv4的地址结构出来
        addr.sin_family = AF_INET;//保存地址域类型
        addr.sin_port = htons(port);//一定要用htons,不能用htonl,保存网络字节序端口
        addr.sin_addr.s_addr = inet_addr(ip);//网络字节序的IP地址
    socklen_t len = sizeof(struct sockaddr_in);

    bind(sockfd, (struct sockaddr*)&addr, len);
    if(ret == -1)
    {
        perror("bind error");
        return -1;
     }

//3.循环接收发送数据
while(1)
{
    //接收数据
    char buf[1024] = {0};
    struct sockaddr_in peer;
    socklen_t len = sizeof(struct sockaddr_in);
    //注意,peer中的地址信息是系统设置的,数据是发的就设置谁的地址
    ssize_t ret = recvfrom(sockfd, buf, 1023, 0, (struct sockaddr*)&peer, &len);
    //recvfrom不但接收数据,还会获取这个数据是谁发送的,也即是对端地址信息
    if(ret < 0)
    {
        perror("recvfrom error");
        return -1;
    }
    char *peerip = inet_ntoa(peer.sin_addr);//将网络字节序地址转换为字符串
    uint16_t port = ntohs(peer.sin_port);//将网络字节序端口,转换为主机字节序端口
    printf("client[%s:%d] say:%s\n", peerip, port, buf);

//4,发送数据
    char data[1024]= 0;
    printf("server say:");
    fflush(stdout);
    scanf("%s", data);
    ret = sendto(sockfa, data, strlen(data), 0, (struct sockaddr*)&peer, len);
    if(ret < 0)
    {
        perror("sendto error");
        return -1;
    }

//5.关闭套接字
    close(sockfd);
    return 0;
}

4.实现一个UDP通信客户端

封装一个UdpSocket类,简化用户对socket的操作

代码在xshell ,UDP文件夹中

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

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

相关文章

平抑风电波动的电-氢混合储能容量优化配置(matlab代码)

目录 1 主要内容 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序部分复现电机文章《平抑风电波动的电-氢混合储能容量优化配置》&#xff0c;针对电-氢混合系统协同平抑接入新型电力系统的新能源波动问题&#xff0c;提出考虑碱性电解槽运行特性的电-氢混合储能容量…

D. Array Restoration(st表 O(1)查询区间最值)

Problem - D - Codeforces 给定一个由n个整数组成的初始数组a&#xff0c;位置从1到n编号。 对该数组执行q次查询&#xff0c;每次查询选择一个区间[li, ri]&#xff08;1≤li≤ri≤n&#xff09;&#xff0c;并将该区间内所有元素的值都改为i。查询的顺序不能更改&#xff0c…

企业多个文件存储系统并行使用,IT人员如何统一高效管理?

文件存储系统在企业内部应用广泛&#xff0c;各个企业使用习惯各不相同。很多企业在业务开展中&#xff0c;由于内部业务结构复杂、部门间文件存储习惯差异化、需要与外部合作伙伴进行数据文件交换等原因&#xff0c;会出现企业内部多个文件存储系统并行使用的情况。 对于IT技术…

IPB60R950C6-ASEMI代理英飞凌高压MOS管IPB60R950C6

编辑&#xff1a;ll IPB60R950C6-ASEMI代理英飞凌高压MOS管IPB60R950C6 型号&#xff1a;IPB60R950C6 品牌&#xff1a;Infineon(英飞凌) 封装&#xff1a;TO-263 最大漏源电流&#xff1a;12A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff…

关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案

在入手全志T113之后&#xff0c;第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常&#xff0c;经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK&#xff0c;但是居然前前后后一共花了至少三个星期…

期刊介绍|骨科老牌期刊,无版面费,审稿极速,毕业不二之选!

今天给大家介绍一本中药方面的期刊&#xff1a;JOURNAL OF ORTHOPAEDIC RESEARCH 一、基本信息 1、期刊名称&#xff1a;JOURNAL OF ORTHOPAEDIC RESEARCH&#xff1b; 2、期刊ISSN: 0736-0266&#xff1b; 3、研究方向&#xff1a;医学-整形外科&#xff1b; 4、出版社&#x…

AI怎么把游戏变好玩?米哈游出手了

《原神》发布两年半后&#xff0c;游戏新贵米哈游终于出新&#xff0c;上线了《崩坏:星穹铁道》。新游戏的一大亮点是内置了一个“图生图”的AIGC工具&#xff0c;用户可上传任何图片&#xff0c;生成对应风格的游戏角色“三月七”。 广大玩家脑洞大开&#xff0c;短短一周时间…

专业的图像编辑软件Affinity Photo 2.04版本在win10系统的下载与安装配置教程

目录 前言一、Affinity Photo安装二、使用配置总结 前言 Affinity Photo 是一款专业的图像编辑软件&#xff0c;提供了很多强大的工具和功能。 一些常用工具的介绍&#xff1a; 选择工具 ——矩形选择工具&#xff1a;用于选择矩形区域。 ——椭圆选择工具&#xff1a;用于选…

Android 网络编程基础

Android 网络编程是一个重要的开发技能&#xff0c;可以让我们的应用程序更加丰富、实用。需要开发者根据实际需求选择合适的网络通信方式&#xff0c;并结合安全协议和数据传输加密算法等措施&#xff0c;以保证数据传输的安全性和可靠性。 网络协议 在 Android 网络编程中&a…

虚拟环境中的 CPU 优化技巧

近年来&#xff0c;虚拟化已成为管理计算资源的主流方式&#xff0c;使用户能够在一台机器上运行多个操作系统和应用程序。虚拟化虽然带来了许多好处&#xff0c;例如更好的资源利用和更大的灵活性&#xff0c;但在优化CPU性能方面也带来了挑战。 在本文中&#xff0c;我们将探…

系统分析师:五、系统配置与性能评价

目录 一、性能指标 二、阿姆达尔解决方案 三、性能评价方法 一、性能指标 性能指标总体如下&#xff1a; 主频&#xff1a;也称时钟频率&#xff0c;主频越高&#xff0c;意味着CPU工作速度越快。它的倒数就是时钟周期。 CPI&#xff1a;每条指令执行锁需要的时钟周期数。 …

那些我收藏多年和偷摸使用的工具~~~

作为一个见到好东西&#xff0c;不管有没有用先收藏的我来说&#xff0c;本期活动实在是太有必要写一篇博客了 目录 展示我的收藏癖生活类收藏学习类收藏工具类收藏谷歌插件类收藏 工具推荐效率工具sublime 文件转换工具text转MarkdownMarkdown-Weixin[Cmd Markdown 编辑阅读器…

算法篇——动态规划大集合(js版)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n…

计算机毕业论文选题推荐|软件工程|系列六

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)的研发部署管理…

正视架构设计的重要作用

要讨论软件架构设计在软件开发中的重要作用&#xff0c;首先让我们来了解一下目前国内软件的开发现状。   总的来说&#xff0c;国内的多数企业仍然是采用“瀑布模型”作为软件开发过程的主要模型。虽然在采用瀑布模型的同时可能会引入原型法以及诸如MSF等其它软件开发方法与…

必须要掌握的音视频编码、解码基础!

一、音视频为什么要编码&#xff1f; 音视频编码技术在音视频领域有着举足轻重的地位&#xff0c;这是由于音视频原始数据量较大&#xff0c;在传输的过程中如果不进行编码的话&#xff0c;则无法进行传输。比方说&#xff0c;一张普通的图片的大小大概是1-2M&#xff0c;假设我…

CH-90Na螯合树脂技术在废水除镍、除总铬、除重上的应用

电镀是利用电化学的方法对金属和非金属表面进行装饰、防护及获得某些新的性质的一种工艺过程。为保证电镀产品的质量&#xff0c;使金属镀层具有平整光滑的良好外观并与基体牢固结合&#xff0c;必须在镀前把镀件表面上的污物&#xff08;油、锈、氧化皮等&#xff09;彻底洗干…

美国Keysight是德科技34461A万用表

安捷伦Keysight是德科技34461A万用表 安捷伦万用表 附加功能&#xff1a; 带有内置条形图、直方图、趋势、数学和统计数据的彩色图形显示 I/O&#xff1a;USB、LAN/LXI、GPIB&#xff08;可选&#xff09; 已启用 BenchVue。从您的 PC 控制您的 DMM&#xff0c;以轻松查看和捕…

【沐风老师】3dMax粒子拖尾光效插件Ky_Trail使用教程

Ky_Trail粒子拖尾光效插件使用教程 【Ky_Trail 用户界面】 Ky_Trail粒子拖尾光效插件,可以模拟各种粒子拖尾效果动画。 【适用版本】 3dMax4 - 2021 【安装方法】 将插件文件“Ky_Trail.dlv”复制到3dMax插件目录中(3ds Max\plugins”)。 【使用方法】 1.插件安装完成后启…

github某0day漏洞投毒与钓鱼样本分析

前言 近日&#xff0c;烽火台实验室监测到多起针对安全人员的钓鱼攻击。其中一例利用MS Office Word 0DAY进行钓鱼&#xff0c;在github.com和Telegram群组中公开0DAY利用程序&#xff0c;其中并没有包含真正的利用程序&#xff0c;但是却捆绑了木马。运行后下载和执行木马程序…