报式套接字通讯实例

报式套接字通讯实例

使用套接字通讯流程

被动端(先运行)
1、取得SOCKET
2、给SOCKET取得地址
3、收/发消息
4、关闭SOCKET

主动端
1、取得SOCKET
2、给SOCKET取得地址(可省略)
3、发/收消息
4、关闭SOCKET

各部分代码实现

proto.h代码如下:

#ifndef PROTO_H__
#define PROTO_H__//定义端口号
#define RCVPORT     "1989"#define NAMESIZE    11//__attribute__((packed))表示结构体取消内存对齐
struct msg_st
{uint8_t name[NAMESIZE];uint32_t math;uint32_t chinese;
}__attribute__((packed));#endif

rcvder.c代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#include "proto.h"#define IPSTRSIZE   40int main()
{int sd;//定义我端的地址laddrstruct sockaddr_in laddr,raddr;struct msg_st rbuf;socklen_t raddr_len;char ipstr[IPSTRSIZE];//使用AF_INET协议族中的默认协议(0),实现SOCK_DGRAMsd = socket(AF_INET,SOCK_DGRAM,0);if(sd < 0){perror("socket()");exit(0);}laddr.sin_family = AF_INET;//因为端口要在网络传输,所以使用htons转换,将本地(host)转为网络(net),宽度为shortladdr.sin_port = htons(atoi(RCVPORT));/*inet_pton将IP地址的点分式转为整数int inet_pton(int af,const char *src,void *dst)参数:af  协议族,要么是IPV4(AF_INET)要么是IPV6(AF_INET6)src 要转换的IP地址dst 转换后要放置的地址处*///"0.0.0.0"表示匹配的任意地址inet_pton(AF_INET,"0.0.0.0",&laddr.sin_addr);//我端的地址和地址长度if(bind(sd,(void *)&laddr,sizeof(laddr)) < 0){perror("bind()");exit(1);}while(1){/*ssize_t recv(int sockfd,void *buf,size_t len,int flags)这个适用于流式套接字,一对一通讯ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen)recvfrom是适用于报式套接字,非一对一的通讯,要记录传输数据地址从哪里来的*//*一定要初始化raddr_len的大小,否则回造成第一次打开地址不对,后面会对*/raddr_len = sizeof(raddr);recvfrom(sd,&rbuf,sizeof(rbuf),0,(void *)&raddr,&raddr_len);//使用inet_ntop();函数将ip大整数转为点分式inet_ntop(AF_INET,&raddr.sin_addr,ipstr,IPSTRSIZE);printf("----MESSAGE FROM IP: %s port: %d---\n",ipstr,ntohs(raddr.sin_port));printf("NAME = %s\n",rbuf.name);printf("MATH = %d\n",ntohl(rbuf.math));printf("CHINESE = %d\n",ntohl(rbuf.chinese));}close(sd);exit(0);
}

编译执行结果如下:

使用netstat -anu命令查看udp网络状态,如果查看tcp使用netstat -ant命令,结果如下1989端口已经打开。

1657706370492

snder.c代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>#include "proto.h"int main(int argc,char *argv[])
{int sd;//将待发送的内容放到sbuf中struct msg_st sbuf;struct sockaddr_in raddr;if(argc < 2){fprintf(stderr,"Usage is short 2\n");exit(1);}sd = socket(AF_INET,SOCK_DGRAM,0);if(sd < 0){perror("socket()");exit(1);}//bind();/*ssize_t send(int sockfd,const void *buf,size_t len,int flags);这个是用于流式套接字,因为式一对一通讯ssize_t sendto(int sockfd,const void *buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen);这个用于报式套接字,因为是一对多,所以要指定目的的地址和大小参数:sockfd  socket函数的返回值buf 要发送的数据len 发送数据的长度,即下一个参数buf的大小flags   有无特殊要求,如无设置0选择默认dest_addr   目的地址addrlen 的地址的大小返回值成功  送出去的字符个数失败 -1*///填充sbuf要发送的数据strcpy(sbuf.name,"Alan");sbuf.math = htonl(rand()%100);sbuf.chinese = htonl(rand()%100);//设置远端的地址,分别设置协议族、端口、IP地址raddr.sin_family = AF_INET;raddr.sin_port = htons(atoi(RCVPORT));inet_pton(AF_INET,argv[1],&raddr.sin_addr);if(sendto(sd,&sbuf,sizeof(sbuf),0,(void *)&raddr,sizeof(raddr)) < 0){perror("sento()ssfd");exit(1);}puts("OK!");close(sd);exit(0);
}

编译运行结果如下:
1657709179287
使snder与rcver建立通信,先执行./rcver,再执行./snder,执行结果如下:
编译运行结果如下:
1657709760180

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

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

相关文章

基于Yolov8的野外烟雾检测(4):通道优先卷积注意力(CPCA),效果秒杀CBAM和SE等 | 中科院2023最新发表

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.CPCA介绍 3.1 CPCA加入到yolov8 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&a…

git:一、GIT介绍+安装+全局配置+基础操作

版本管理系统&#xff08;SVN和Git&#xff09;&#xff1a; 集中式版本控制系统&#xff08;SVN&#xff09; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的. 工作流程如下: 1.从中央服务器远程仓库下载代码 2.修改后将代码提交到中央服务器远程仓库…

爬虫 — Scrapy 框架(一)

目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…

知识付费平台开发技术实践:构建数字学习的未来

引言 知识付费平台的兴起正在塑造着数字学习的未来。本文将介绍一些关键的技术实践&#xff0c;帮助开发者构建强大的知识付费平台&#xff0c;提供出色的数字学习体验。 1. 选择适当的技术栈 在开始知识付费平台的开发之前&#xff0c;首要任务是选择适当的技术栈。这包括…

npm常用命令系统介绍

npm常用命令系统介绍 npm helpnpm initpackage.json 文件package.json 文件属性说明默认 package.json 文件--参数[-yes|-y]设置 package.json 中字段的默认值package-lock.json 文件 npm [config|c]设置源 npm [install|i]可选参数&#xff1a;全局安装的特性 包的删除npm uni…

百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)

百度SEO优化不稳定介绍&#xff1a;蘑菇号-www.mooogu.cn 随着百度SEO算法的不断变化和升级&#xff0c;许多网站的SEO排名经常出现不稳定的情况&#xff0c;这种情况在一定程度上影响了网站的流量和排名&#xff0c;导致网站的质量评分降低。因此&#xff0c;深入分析百度SEO…

【收藏】如何最快取得NISP二级和CISP

【收藏】如何最快取得NISP二级和CISP &#x1f449;今天小编来给大家讲解一下如何最快的取得NISP二级和CISP证书 ✅我们从如下几个方面为大家讲解&#xff1a; &#x1f53a;报名条件 &#x1f53a;考试形式 &#x1f53a;考试题型 &#x1f53a;如何备考 &#x1f53a;证书用途…

腾讯面试题:无网络环境,如何部署Docker镜像?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;很高兴再次和大家见面。今天&#xff0c;我要和大家聊聊一个特别有趣的话题——腾讯面试题&#xff1a;无网络环境&#xff0c;如何部署Docker镜像&#xff1f;这可是一个技术含量颇高的问题哦&#xff01;废…

云原生微服务 第五章 Spring Cloud Netflix Eureka集成负载均衡组件Ribbon

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第四章 Spring Cloud Netflix 之 Ribbon 文章目录 系列文章目录[TOC](文章目录) 前言1、负载均衡1.1、服务端负载均衡1.2、…

Mybatis SQL构建器

上一篇我们介绍了在Mybatis映射器中使用SelectProvider、InsertProvider、UpdateProvider、DeleteProvider进行对数据的增删改查操作&#xff1b;本篇我们介绍如何使用SQL构建器在Provider中优雅的构建SQL语句。 如果您对在Mybatis映射器中使用SelectProvider、InsertProvider…

在线人才测评,招聘技术研发类岗位的人才测评方案

企业的发展离不开技术创新&#xff0c;与其他岗位的员工相比&#xff0c;研发岗位创造性强&#xff0c;较为独立&#xff0c;技术专业度高&#xff0c;对研发技术类岗位的招聘&#xff0c;不仅仅是在专业能力方面做要求&#xff0c;还需要从人员素质&#xff0c;潜在能力方面入…

深入了解队列数据结构:定义、特性和实际应用

文章目录 &#x1f34b;引言&#x1f34b;队列的定义&#x1f34b;队列的实现&#x1f34b;队列的应用&#x1f34b;练习题&#x1f34b;结语 &#x1f34b;引言 队列&#xff08;Queue&#xff09;是计算机科学中一种重要的数据结构&#xff0c;它常用于各种应用程序中&#x…

本地项目上传至码云gitee

1、springboot-mgx是需要上传的项目 2、码云后台创建一个新的仓库 3、创建完成后&#xff0c;复制下来https链接&#xff0c;后面要用到。 4、进入项目要上传的文件中 5、对git进行初始化&#xff0c;git指令 git init 6、 上传项目至gitee &#xff08;1&#xff09;连接远…

2023年中国研究生数学建模竞赛D题解题思路

为了更好的帮助大家第一天选题&#xff0c;这里首先为大家带来D题解题思路&#xff0c;分析对应赛题之后做题阶段可能会遇到的各种难点。 稍后会带来D题的详细解析思路&#xff0c;以及相关的其他版本解题思路 成品论文等资料。 赛题难度评估&#xff1a;A、B>C>E、F&g…

【C语言】数组和指针刷题练习

指针和数组我们已经学习的差不多了&#xff0c;今天就为大家分享一些指针和数组的常见练习题&#xff0c;还包含许多经典面试题哦&#xff01; 一、求数组长度和大小 普通一维数组 int main() {//一维数组int a[] { 1,2,3,4 };printf("%d\n", sizeof(a));//整个数组…

【Stm32】【Lin通信协议】Lin通信点亮灯实验

Lin通信点亮灯实验 通过STM32的串口发送数据&#xff0c;然后通过串口转换模块将数据转换成LIN&#xff08;Local Interconnect Network&#xff09;协议&#xff0c;最终控制点亮灯。需要工程和入门资料的可以私信我&#xff0c;看到了马上回。 入门书本推荐&#xff1a; 一…

el-upload 上传附件(拆解步骤)

目录 1. 看elementui /element-plus 官网案例 2. html部分&#xff1a; 把官网上的搬下来&#xff0c;最好加一个按钮&#xff0c;上传到服务器&#xff08;后端&#xff09; 3. js 部分&#xff1a; 3.1 首先&#xff0c;先定义一个变量&#xff0c;files 3.2 当上传图片…

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-图像去噪 [北邮鲁鹏]

目录标题 参考学习链接图像噪声噪声分类椒盐噪声脉冲噪声对椒盐噪声&脉冲噪声去噪使用高斯卷积核中值滤波器 高斯噪声减少高斯噪声 参考学习链接 计算机视觉与深度学习-04-图像去噪&卷积-北邮鲁鹏老师课程笔记 图像噪声 噪声点&#xff0c;其实在视觉上看上去让人感…

【Unity】【C#】【VS】如何将VS写的通用C#窗体程序修改为Unity程序

【背景】 需要将一个Visual2019写的C#用Unity改写。 Unity写窗体程序的一大优点就是美观了,看看这默认界面。 但是缺点就是启动时有个Unity过场动画。 【问题】 Unity虽然用的也是C#,但是和Visual2019的通用窗体C#采用的界面显示的库,图像处理,组成一个脚本的基本函数等…