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

UDP通信发送和接收 || UDP实现全双工通信

recvfrom


    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
    功能:
        从套接字中接收数据
    参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        flags:属性 默认为0 
        src_addr:存放IP地址信息的空间首地址
        addrlen:存放接收到IP地址大小空间的首地址
    返回值:
        成功返回实际接收字节数
        失败返回-1 

修改虚拟机到桥接模式

    点击"虚拟机"
    点击"设置"
    点击"网络适配器"
    选择"桥接模式"
    点击"确定"

3.将网卡桥接到无线网卡
    点击"编辑"
    点击"虚拟网络编辑器"
    点击"更改设置"

4.在Ubuntu中重启网络服务
    sudo /etc/init.d/networking restart 

    ifconfig

bind 
    int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
    功能:
        在套接字上绑定一个IP地址和端口号
    参数:
        sockfd:套接字文件描述符
        addr:绑定IP地址空间首地址
        addrlen:绑定IP地址的长度
    返回值:
        成功返回0 
        失败返回-1 

UDP需要注意的细节点:

    1.UDP是无连接,发端退出,收端没有任何影响
    2.UDP发送数据上限,最好不要超过1500个字节
    3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

UDP包头长度:8个字节
    源端口号(2个字节)
    目的端口号(2个字节)
    长度(2个字节)
    校验和(2个字节)

wireshark

 抓包工具

  操作流程:
    1.sudo wireshark
      打开wireshark抓包工具
    2.选择抓取数据包的网卡
      any
    3.执行通信的代码
    4.停止通信
    5.设定过滤条件
        ip.addr == IP地址 
        udp 
        tcp 
        udp.port == 端口
 

使用UDP实现文件的发送

发送端代码:

/*************************************************************************> File Name: recv_file.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: Wed 06 Mar 2024 02:11:43 PM CST************************************************************************/#include<stdio.h>
#include "head.h"
int main(void)
{int sockfd = 0;struct sockaddr_in sendaddr;ssize_t nret = 0;char filename[1024] = {0};int pf = 0;char tmpbuff[1024] = {0};int nbyte = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1){perror("fail to socket");return -1;}fgets(filename, sizeof(filename), stdin);sendaddr.sin_family = AF_INET;sendaddr.sin_port = htons(50000);sendaddr.sin_addr.s_addr = inet_addr("192.168.1.174");nbyte = sendto(sockfd, filename, strlen(filename), 0, (struct sockaddr *)&sendaddr, sizeof(sendaddr));if (nbyte == -1){perror("fail to sendto");return -1;}pf = open(filename, O_RDONLY);if (pf == -1){perror("fail to open");return -1;}while(1){memset (tmpbuff, 0, sizeof(tmpbuff));nret = read(pf, tmpbuff, sizeof(tmpbuff));if(nret <= 0){break;}nret = sendto(sockfd, tmpbuff, nret, 0, (struct sockaddr *)&sendaddr, sizeof(sendaddr));}close(pf);close(sockfd);return 0;
}

接收端代码:

#include<stdio.h>
#include "head.h"
int main(void)
{int sockfd = 0;ssize_t nsize = 0;struct sockaddr_in recvaddr;struct sockaddr_in sendaddr;ssize_t nret = 0;char filename[1024] = {0};socklen_t addlen = sizeof(recvaddr);int pf = 0;char tmpbuff[1024] = {0};int retbind = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1){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.174");retbind = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (retbind == -1){perror("fail to bind");return -1;}//printf("!!!!!!!!!!!\n");nsize = recvfrom(sockfd, filename, sizeof(filename), 0,(struct sockaddr *)&sendaddr, &addlen);if (-1 == nsize){perror("fail to recvfrom");return -1;}//printf("!!!!!!!!!!!\n");//printf("filename = %s\n", filename);pf = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664);if (pf == -1){perror("fail to open");return -1;}while(1){memset (tmpbuff, 0, sizeof(tmpbuff));nret = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0,(struct sockaddr *)&recvaddr, &addlen);if (nret <= 0){break;}write(pf, tmpbuff, nret);}close(pf);close(sockfd);return 0;
}

使用UDP实现两个主机间的全双工通信

/*************************************************************************> File Name: homework.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: Wed 06 Mar 2024 06:09:58 PM CST************************************************************************/#include<stdio.h>
#include "head.h"
struct cilent
{char name[32];char text[1024];
};struct cilent mycilent;
struct cilent youcilent;void *pthreadSend(void *arg)
{int sockid = 0;struct sockaddr_in recvaddr;int nret = 0;sockid = socket(AF_INET, SOCK_DGRAM, 0);if (sockid == -1){perror("fail to socket");return NULL;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.1.152");scanf("%s", mycilent.name);nret = sendto(sockid, mycilent.name, sizeof(mycilent.name), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (nret == -1){perror("fail to sendto");return NULL;}while(1){memset(mycilent.text, 0, sizeof(mycilent.text));scanf("%s", mycilent.text);nret = sendto(sockid, mycilent.text, sizeof(mycilent.text), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (nret == -1){perror("fail to sendto");return NULL;}if(strcmp(mycilent.text, ".quit") == 0){break;}}close(sockid);
}void *pthreadRecv(void *argv)
{int sockid = 0;struct sockaddr_in recvaddr;struct sockaddr_in getaddr;socklen_t addlen = sizeof(getaddr);int nret = 0;sockid = socket(AF_INET, SOCK_DGRAM, 0);if (sockid == -1){perror("fail to socket");return NULL;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.1.174");bind(sockid, (struct sockaddr *)&recvaddr, sizeof(recvaddr));nret = recvfrom(sockid, youcilent.name, sizeof(youcilent.name), 0, (struct sockaddr *)&getaddr, &addlen);if (nret == -1){perror("fail to sendto");return NULL;}while(1){memset(youcilent.text, 0, sizeof(youcilent.text));nret = recvfrom(sockid, youcilent.text, sizeof(youcilent.text), 0, (struct sockaddr *)&getaddr, &addlen);if (nret == -1){perror("fail to sendto");return NULL;}printf("%s(%s:%d)>%s\n", youcilent.name, inet_ntoa(getaddr.sin_addr), ntohs(getaddr.sin_port), youcilent.text);if(strcmp(youcilent.text, ".quit") == 0){break;}}close(sockid);
}int main(void)
{pthread_t Send;pthread_t Recv;pthread_create(&Send, NULL, pthreadSend, NULL);pthread_create(&Recv, NULL, pthreadRecv, NULL);pthread_join(Send, NULL);pthread_join(Recv, NULL);return 0;
}

使用线程实现并行收发

相关文章:

UDP通信发送和接收 || UDP实现全双工通信

recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 功能: 从套接字中接收数据 参数: sockfd:套接字文件描述符 buf:存放数据空间首地址 …...

Mac 以SH脚本安装Arthas

SH脚本安装Aethas curl -L https://alibaba.github.io/arthas/install.sh | sh安装脚本说明 示例源文件&#xff1a; #! /bin/bash# temp file of as.sh TEMP_ARTHAS_FILE"./as.sh.$$"# target file of as.sh TARGET_ARTHAS_FILE"./as.sh"# update timeo…...

Elasticsearch:dense vector 数据类型及标量量化

密集向量&#xff08;dense_vector&#xff09;字段类型存储数值的密集向量。 密集向量场主要用于 k 最近邻 (kNN) 搜索。 dense_vector 类型不支持聚合或排序。 默认情况下&#xff0c;你可以基于 element_type 添加一个 dend_vector 字段作为 float 数值数组&#xff1a; …...

Linux C/C++下使用Lex/Yacc构建实现DBMS(Minisql)

DBMS&#xff08;数据库管理系统&#xff09;是一种用于管理和组织数据库的软件系统。它的重要性在于提供了一种有效地存储、管理和访问大量数据的方式。本文将深入探讨如何使用C语言、Lex&#xff08;词法分析器生成器&#xff09;和Yacc&#xff08;语法分析器生成器&#xf…...

c语言指针小白基础教学

指针 1. 什么是指针&#xff1f;2. 如何编址&#xff08;即如何给地址分配空间呢&#xff09;3. 概念和基本术语3.1指针的值指针所指向的地址/内存区3.2 指针的类型&#xff08;指针本身的类型&#xff09;思考&#xff1a; 3.3 指针所指向的类型3.4 指针本身所占据的内存区3.5…...

面向对象设计之里氏替换原则

设计模式专栏&#xff1a;http://t.csdnimg.cn/4Mt4u 思考&#xff1a;什么样的代码才算违反里氏替换原则&#xff1f; 目录 1.里氏替换原则的定义 2.里氏替换原则与多态的区别 3.违反里氏替换原则的反模式 4.总结 1.里氏替换原则的定义 里氏替换原则&#xff08;Liskov S…...

MySQL·SQL优化

目录 一 . 前言 二 . 优化方法 1 . 索引 &#xff08;1&#xff09;数据构造 &#xff08;2&#xff09;单索引 &#xff08;3&#xff09;explain &#xff08;4&#xff09;组合索引 &#xff08;5&#xff09;索引总结 2 . 避免使用select * 3 . 用union all代替u…...

Dockerfile指令大全

Dockerfile文件由一系列指令和参数组成。指令的一般格式为INSTRUCTION arguments。具体来说&#xff0c;包括"配置指令"(配置镜像信息)和"操作指令"(具体执行操作)。每条指令&#xff0c;如FROM&#xff0c;都是大小写不敏感的。但是为了区分指令和参数&am…...

第八个实验:(A+B)-C的结果判断奇偶特性

实验内容:(A+B)-C的结果判断奇偶特性,最后显示结果 实验步骤: 第一步:建立项目 第二步:实验步骤,编写程序 第三步:实验结果...

设计模式:观察者模式 ⑧

一、思想 观察者模式是一种常见的设计模式&#xff0c;也称作发布-订阅模式。它主要解决了对象之间的通知依赖关系问题。在这种模式中&#xff0c;一个对象&#xff08;称作Subject&#xff09;维护着一个对象列表&#xff0c;这些对象&#xff08;称作Observers&#xff09;都…...

【重温设计模式】迭代器模式及其Java示例

迭代器模式的介绍 在编程领域&#xff0c;迭代器模式是一种常见的设计模式&#xff0c;它提供了一种方法&#xff0c;使得我们可以顺序访问一个集合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。你可以把它想象成一本书&#xff0c;你不需要知道这本书是怎么印…...

(001)UV 的使用以及导出

文章目录 UV窗口导出模型的主要事项导出时材质的兼容问题unity贴图导出导出FBX附录 UV窗口 1.uv主要的工作区域&#xff1a; 2.在做 uv 和贴图之前&#xff0c;最好先应用下物体的缩放、旋转。 导出模型的主要事项 1.将原点设置到物体模型的底部&#xff1a; 2.应用修改器的…...

一文理解CAS和自旋的区别(荣耀典藏版)

目录 一、自旋 二、CAS 三、什么是 ABA 问题 大家好&#xff0c;我是月夜枫&#xff0c;通常在面试的时候&#xff0c;或者在学习的时候&#xff0c;经常性的会遇到一些关于锁的问题&#xff0c;尤其是面试官会提出提问&#xff0c;你对锁了解的多么&#xff1f;你知道锁的原…...

【吊打面试官系列】Java虚拟机JVM篇 - 关于内存溢出

大家好&#xff0c;我是锋哥。今天分享关于内存溢出的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是内存溢出&#xff1f; 内存溢出&#xff08;OOM&#xff09;是指可用内存不足。程序运行需要使用的内存超出最大可用值&#xff0c;如果不进行处理就会影响到其他…...

思科网络中如何配置标准ACL协议

一、什么是标准ACL协议&#xff1f;有什么作用及配置方法&#xff1f; &#xff08;1&#xff09;标准ACL&#xff08;Access Control List&#xff09;协议是一种用于控制网络设备上数据流进出的协议。标准ACL基于源IP地址来过滤数据流&#xff0c;可以允许或拒绝特定IP地址范…...

蓝桥杯刷题(二)

参考大佬代码&#xff1a;&#xff08;区间合并二分&#xff09; import os import sysn, L map(int, input().split()) # 输入n,len arr [list(map(int, input().split())) for _ in range(n)] # 输入Li,Si def check(Ti, arr, L)->bool:sec [] # 存入已打开的阀门在…...

【Python】牛客网—软件开发-Python专项练习(day1)

1.&#xff08;单选&#xff09;下面哪个是Python中不可变的数据结构&#xff1f; A.set B.list C.tuple D.dict 可变数据类型&#xff1a;列表list[ ]、字典dict{ }、集合set{ }(能查询&#xff0c;也可更改)数据发生改变&#xff0c;但内存地址不变 不…...

P3405 [USACO16DEC] Cities and States S题解

题目 Farmer John有若干头奶牛。为了训练奶牛们的智力&#xff0c;Farmer John在谷仓的墙上放了一张美国地图。地图上表明了每个城市及其所在州的代码&#xff08;前两位大写字母&#xff09;。 由于奶牛在谷仓里花了很多时间看这张地图&#xff0c;他们开始注意到一些奇怪的…...

JavaScript原型和原型链

JavaScript每个对象拥有一个原型对象 需要注意的是&#xff0c;只有函数对象才有 prototype 属性 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff…...

PyTorch之完整的神经网络模型训练

简单的示例&#xff1a; 在PyTorch中&#xff0c;可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码&#xff1a; import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…...

贾子成功定理:逆熵动力学——成功 = 德能 × 劫难 ÷ 熵增惯性

贾子成功定理&#xff1a;逆熵动力学——成功 德能 劫难 熵增惯性摘要&#xff1a; 贾子成功定理提出成功本质是逆熵跃迁&#xff0c;核心公式S kT/I&#xff0c;其中S为成功量级&#xff0c;k为德能指数&#xff08;劫难转化效率&#xff09;&#xff0c;T为天命劫难强度&…...

2026届毕业生推荐的五大降AI率工具横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于自然语言处理技术的AI写作工具&#xff0c;能辅助用户迅速生成各类文本内容&#xff0c;…...

ZooKeeper启动报错排查指南:从JMX配置到dataDir路径修正

1. ZooKeeper启动报错&#xff1a;JMX与dataDir问题全景解析 第一次启动ZooKeeper时看到满屏红色报错&#xff0c;相信很多开发者都会心头一紧。最近在搭建Kafka集群时&#xff0c;我就遇到了经典的启动报错组合拳&#xff1a; ZooKeeper JMX enabled by default Using config:…...

Appwrite React Native SDK性能优化终极指南:缓存、分页与批量操作技巧

Appwrite React Native SDK性能优化终极指南&#xff1a;缓存、分页与批量操作技巧 【免费下载链接】sdk-for-react-native [READ ONLY] Official Appwrite React Native SDK &#x1f499; ⚛︎ 项目地址: https://gitcode.com/gh_mirrors/sd/sdk-for-react-native App…...

【2026奇点智能技术大会权威解码】:医学影像分析三大范式跃迁与临床落地时间表

第一章&#xff1a;2026奇点智能技术大会&#xff1a;医学影像分析 2026奇点智能技术大会(https://ml-summit.org) 多模态融合模型在CT与MRI联合诊断中的突破 本届大会首次公开部署的MedFusion-Net v3.2&#xff0c;支持同步解析低剂量CT、3T MRI T1/T2/FLAIR序列及PET-CT配准…...

别再被时序约束吓到了!用Vivado/Quartus给FPGA新手的第一份“安全驾驶指南”

FPGA时序约束新手指南&#xff1a;从畏惧到驾驭的实战手册 第一次在示波器上看到那些不规则的毛刺时&#xff0c;我的手心冒出了冷汗。那是我用FPGA驱动高速ADC的第三个不眠之夜&#xff0c;明明仿真完美的设计&#xff0c;在实际硬件上却产生了随机错误。我的导师走过来看了一…...

三大技术路径解析:JavaScript直链提取工具如何重塑网盘下载体验

三大技术路径解析&#xff1a;JavaScript直链提取工具如何重塑网盘下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云…...

腾讯混元翻译模型优化:Hunyuan-MT-7B推理速度提升技巧分享

腾讯混元翻译模型优化&#xff1a;Hunyuan-MT-7B推理速度提升技巧分享 1. 引言 在当今全球化时代&#xff0c;机器翻译技术已成为跨语言沟通的重要桥梁。腾讯混元Hunyuan-MT-7B作为业界领先的开源翻译大模型&#xff0c;凭借其在WMT25竞赛中30种语言第一名的卓越表现&#xf…...

C# .NET 周刊|2026年3月2期

国内文章dotnet 10 已知问题 构建 WPF 时提示 System.Private.Windows.GdiPlus 程序集未找到错误https://www.cnblogs.com/lindexi/p/19224133本文记录 dotnet 10 的已知问题&#xff0c;将会导致 WPF 项目构建的时候给出错误dotnet C# 警惕结构体加等事件https://www.cnblogs.…...

别再死记硬背了!用HTTPS握手过程,一次搞懂AES和RSA是怎么分工的

HTTPS握手过程&#xff1a;AES与RSA如何协同守护你的数据安全 每次在浏览器地址栏看到那个绿色小锁图标时&#xff0c;你是否好奇过背后的技术魔法&#xff1f;让我们跟随一次真实的HTTPS请求&#xff0c;看看加密算法们如何在幕后默契配合。这不是枯燥的理论课&#xff0c;而是…...