报式套接字通讯实例

news2024/11/18 21:33:46

报式套接字通讯实例

使用套接字通讯流程

被动端(先运行)
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   40

int main()
{

    int sd;
    //定义我端的地址laddr
    struct sockaddr_in laddr,raddr;
    struct msg_st rbuf;
    socklen_t raddr_len;
    char ipstr[IPSTRSIZE];

    //使用AF_INET协议族中的默认协议(0),实现SOCK_DGRAM
    sd = socket(AF_INET,SOCK_DGRAM,0);
    if(sd < 0)
    {
        perror("socket()");
        exit(0);
    }

    laddr.sin_family = AF_INET;
    //因为端口要在网络传输,所以使用htons转换,将本地(host)转为网络(net),宽度为short
    laddr.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.coloradmin.cn/o/1032363.html

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

相关文章

exe文件运行后无输出直接闪退如何找解决办法

一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息&#xff0c;直接用搜索引擎搜索这个异常代码能大致判断是什么问题&#xff0c;给了一个解决思路&#xff0c;不至于不知道到底哪里出了问题

prometheus+node+process-exporter+grafans

安装Prometheus 要在Ubuntu 18.04上安装Prometheus&#xff0c;您可以按照以下步骤进行&#xff1a; sudo apt-get update安装依赖&#xff1a; sudo apt-get install wget tar下载最新的Prometheus版本&#xff1a; wget https://github.com/prometheus/prometheus/releas…

月木学途开发 3.博客模块开发

概述 效果展示 数据库设计 专栏表 DROP TABLE IF EXISTS blog_column; CREATE TABLE blog_column (blogColumnId int(11) NOT NULL AUTO_INCREMENT,blogColumnName varchar(255) DEFAULT NULL,blogColumnCoverImg longtext,blogColumnIntroduction longtext,userId int(11) D…

LeetCode算法心得——连续的子数组和(前缀和+HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;同余定理的应用加上hashmap的灵活应用&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .连续的子数组的和 题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;编写一个函数来判断…

【 2023华为杯C题】大规模创新类竞赛评审方案研究(思路、代码......)

目录 1 题目概述 2 问题 3 极差的定义及标准分的计算方法 4 题目及数据下载 5 思路、代码下载...... 1 题目概述 现在创新类竞赛很多&#xff0c;其中规模较大的竞赛&#xff0c;一般采用两阶段&#xff08;网评、现场评审&#xff09;或三阶段&#xff08;网评、现场评审…

pcl--第十节 点云曲面重建

曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如&#xff0c;在汽车、航空等工业领域中&#xff0c;复杂外形产品的设计仍需要根据手工模型&#xff0c;采用逆向工程的手段建立产品的数字化模型&#xff0c;根据测量数据建…

[React] 自定义hooks设计模式

文章目录 1.自定义hooks设计1.1 自定义hooks1.2 设计一个自定义hooks1.3 自定义hooks的驱动条件1.4 自定义hooks的通用模式1.5 自定义hooks的条件限定 1.自定义hooks设计 react-hooks是react16.8以后&#xff0c;react新增的钩子API&#xff0c;目的是增加代码的可复用性&…

线性表应用(非递减合并、分解链表、删除线性表)

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间&#xff0c;不另外占用其它的存储空间。表中允许有重复的数据。 #include<iostream> using namespace std; typedef struct list {int data;list* next; }list,*linklist;…

Linux 系统移植(一)-- 系统组成

参考资料&#xff1a; linux系统移植篇&#xff08;一&#xff09;—— linux系统组成【野火Linux移植篇】1-uboot初识与编译/烧录步骤 文章目录 一、linux系统组成二、Uboot三、Linux内核四、设备树 本篇为Linux系统移植系列的第一篇文章&#xff0c;介绍了一个完整可运行的L…

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)

10. 灾后重建 Pear市一共有N&#xff08;<50000&#xff09;个居民点&#xff0c;居民点之间有M&#xff08;<200000&#xff09;条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近&#xff0c;一次严重的地震毁坏了全部M条道路。 震后…

【10个OOM异常的场景以及对应的排查经验】

文章目录 1. 场景描述&#xff1a;内存泄漏2. 场景描述&#xff1a;过多线程3. 场景描述&#xff1a;大量数据查询4. 场景描述&#xff1a;大文件读取5. 场景描述&#xff1a;高并发访问6. 场景描述&#xff1a;大字符串操作7. 场景描述&#xff1a;大数据集合操作8. 场景描述&…

C语言-扫雷游戏的实现

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

反射【Java】

概念&#xff1a;允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问 获取class对象 Class.forName("全类名"); //全类名&#xff1a;包名类名 类名.class 对象.getClass(); //有一个名为Goods的类Class clazz1 Class.forName("com.ln1.Goo…

VR赋能红色教育,让爱国主义精神永放光彩

昨天的918防空警报长鸣&#xff0c;人们默哀&#xff0c;可见爱国主义精神长存。为了贯彻落实“把红色资源利用好、红色传统发扬好、红色基因传承好”的指示精神&#xff0c;许多红色景点开始引入VR全景展示技术&#xff0c;为游客提供全方位720度无死角的景区展示体验。 VR全…

【电源专题】什么是充电芯片的Shipping Mode(船运模式)

现在越来越多电子产品小型化,手持化,这样就需要电池来为产品供电。但电池供电造成的另一个难题就是产品的续航能力的强与弱。 如果想提升续航能力,有一种方法是提高电池容量。如果电池体积没有变化的情况下,可能使用了新型材料、高级技术来增加电池容量,但这势必会增加电池…

Webpack设置代码映射,可调试打包后的代码

当我们的代码打包过后再看源码就会变成下面这个样子&#xff1a; 这时候我们就调试不了我们的代码 解决方式&#xff1a; 在webpack.config.js中添加如下代码&#xff1a; module.exports {mode: "development", // 设置打包的模式&#xff1a;production生产模式…

2000-2021年上市公司劳动投资效率测算数据:劳动投资效率、冗余雇佣、雇佣不足(含原始数据和计算代码do文档)

2000-2021 年上市公司劳动投资效率测算数据&#xff1a;劳动投资效率、冗余雇佣、雇佣不足 &#xff08;含计算代码do文档&#xff09; 1、时间&#xff1a;2000-2021 年 2、范围&#xff1a;沪深A 股上市公司 3、指标&#xff1a;code、year、证券代码、货币资金、短期投资…

TexStudio报错 Class: No Found

\classdocument[preprint,review,fleqn,sort&compress,3p]{elsarticle}这里常见导入的类&#xff08;class&#xff09;文件有article.cls&#xff0c;elsarticle.cls&#xff0c;sn-jnl.cls等 一般来说这些文件都应该和我们的源文件document.tex在同一个目录下。如果不在…

Vue复选框批量删除示例

Vue复选框批量删除 通过使用v-model指令绑定单个复选框 例如<input type"checkbox" id"checkbox" v-model"checked"> 而本次我们要做的示例大致是这样的&#xff0c;首先可以增加内容&#xff0c;然后通过勾选来进行单独或者批量删除&…

chk文件怎么恢复?chk文件恢复软件哪个好?

电脑中的每个文件都有其不同的后缀名&#xff0c;如.txt、.png等等&#xff0c;那么你知道.chk后缀的文件是什么吗&#xff1f;下面我们就来一起了解一下吧。 chk文件的含义 chk文件是用户在使用磁盘碎片整理程序后所产生的丢失簇的恢复文件&#xff0c;磁盘中的原文件并没有丢…