LinuxUDP编程

         由于UDP是无连接、尽力传输的,所以Server端绑定完IP、端口号后,使用recvfrom可以阻塞等待客户端的数据,而且Client端通过sendto发送的数据包直接发送到互联网(也是基于IP、端口号)这种操作是不担保Server端是否收到的,适用于实时音视频传输DNS的域名解析

一、Sendto

实际上,sendto和recvfrom都是对于send和recv的扩展-----增加参数(用于绑定IP、端口号)

因为UDP是无连接的,想要传输信息实际上还是需要对象的信息,只不过它的信息不用像TCP编程中实际地对sock_fd进行绑定,而是直接通过参数绑定

#include <sys/types.h>
#include <sys/socket.h>

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags
              struct sockaddr *dest_addr, socklen_t addrlen
              )
    
params: 前三个参数同write
    	flags		一般填0---此时同write
    				MSG_DONTWAIT 非阻塞版本
    				MSG_OOB 用于发送TCP类型的带外数据(out-of-band)
    	dest_addr	目标的结构体指针(配置IP、端口号)
    	addrlen		目标的结构体大小

二、Recvfrom

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recvfrom(int sockfd, const void *buf, size_t len, int flags
              struct sockaddr *src_addr, socklen_t *addrlen
              )
    
params: 前三个参数同read
    	flags		一般填0---此时同read
    				MSG_DONTWAIT 非阻塞版本
    				MSG_OOB 用于发送TCP类型的带外数据(out-of-band)
    	src_addr	发送方的结构体指针(配置IP、端口号)
    	addrlen		发送方的结构体大小的指针----注意和sendto中的区别!!
    
return: 成功返回收到字节数,失败返回-1

三、服务器端

 #include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h> //exit
#include <string.h> //bzero
#include <strings.h> //strncasecmp 忽略大小写比较
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SERV_PORT (5001)
#define SERV_IP   "127.0.0.1"
#define BUFSIZE   (128)
#define QUIT_STR  "quit"

int main(void)
{
    int sock_fd;
    struct sockaddr_in sin,cin;

    //1.创建 注意套接字类型变化---数据报套接字
    sock_fd = socket(AF_INET,SOCK_DGRAM,0);
    if( sock_fd == -1)
    {
        perror("socket");
        exit(1);
    }
    //优化:允许绑定地址快速重用
    int b_reuse = 1;
	setsockopt (sock_fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof (int));
    //2.绑定   
    bzero(&sin,sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port   = htons(SERV_PORT);
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    if( (bind(sock_fd,(struct sockaddr*)&sin,sizeof(sin))) < 0 )
    {
        perror("bind");
        exit(1);
    }
    //3.循环服务器模型
    char rd_buf[BUFSIZ];
    socklen_t cin_len = sizeof(cin);
    while(1)
    {
        bzero(rd_buf,BUFSIZ);
        if( recvfrom(sock_fd,rd_buf,BUFSIZ-1,(struct sockaddr*)&cin,&cin_len) < 0 )
        {
            perror("recvfrom");
            continue;
        } 
        //发送方的信息处理
        char cin_ip[16];
        if( inet_ntop(AF_INET,(void*)&cin.sin_addr,cin_ip,sizeof(cin)) == 0)
        {
            perror("inet_ntop");
            exit(1);
        }
        printf("Received from(%s:%d),data:%s",cin_ip,ntohs(cin.sin_port),rd_buf);

    }

    close(sock_fd);
    return 0;
}

四、客户端

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h> //exit
#include <string.h> //bzero
#include <strings.h> //strncasecmp 忽略大小写比较
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SERV_PORT (5001)
#define SERV_IP   "127.0.0.1"
#define BUFSIZE   (128)
#define QUIT_STR  "quit"

void usage(char *s)
{
    printf("\nWarning:too few parameters!\n");
    printf("\n\t%s SERV_IP SERV_PORT\n",s);
    printf("SERV_PORT must > 5000\n");
}


int main(int argc, char **argv)
{
    if( argc != 3)
    {
        usage(argv[0]);
        exit(1);
    }

    int sock_fd;
    struct sockaddr_in sin;

    //1.创建
    sock_fd = socket(AF_INET,SOCK_DGRAM,0);
    if(sock_fd == -1)
    {
        perror("socket");
        exit(1);
    }
    //配置sockaddr_in信息---用于sendto
    bzero(&sin,sizeof(sin));
    sin.sin_family = AF_INET;
    //端口号、IP都从输入参数获得
    u_short port = (u_short)atoi(argv[2]);
    if(port<5000)
    {
        perror("port");
        exit(1);
    } 
    sin.sin_port = htons(port);
    if( inet_pton(AF_INET,argv[1],(void*)&sin.sin_addr) != 1)
    {
        perror("inet_pton");
        exit(1);
    }
    char wr_buf[BUFSIZE];
    while(1)
    {
        //键盘获取内容-->发送到服务器
        bzero(wr_buf,BUFSIZE);
        if( fgets(wr_buf,BUFSIZE-1,stdin) == NULL )
        {
            perror("fgets");
            continue;
        }
        sendto(sock_fd,wr_buf,strlen(wr_buf),0,(struct sockaddr*)&sin,sizeof(sin));
        if( strncasecmp(wr_buf,QUIT_STR,strlen(QUIT_STR)) == 0) //输入了quit
        {
            break;
        }

    }

    close(sock_fd);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx基本介绍及conf文件的作用

文章目录 前言一、Nginx基本介绍1.1 what is Nginx &#xff1f;1.2 Nginx中的三个概念1.3 nginx安装1.4 运行nginx 二、nginx配置文件conf2.1 conf文件组成部分2.1.1 全局块2.1.2 events块2.1.3 http块 三、其他概念3.1 nginx惊群3.2 负载均衡 总结 前言 本文将介绍nginx的基…

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…

GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册

文章目录 GitLab基础环境部署&#xff1a;Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、GitLab安装配置2.1 安装GitLab所需的依赖包2.2 添加GitLab存储库2.2.1 将GitLab存储…

【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解

前言 &#x1f31f;&#x1f31f;本期讲解关于HTMLCSSJavaScript的基础知识&#xff0c;小编带领大家简单过一遍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …

6. 一分钟读懂“抽象工厂模式”

6.1 模式介绍 书接上文&#xff0c;工厂方法模式只能搞定单一产品族&#xff0c;遇到需要生产多个产品族时就歇菜了。于是&#xff0c;在需求的“花式鞭策”下&#xff0c;程序员们再次绷紧脑细胞&#xff0c;创造出了更强大的抽象工厂模式&#xff0c;让工厂一次性打包多个产品…

数仓技术hive与oracle对比(五)

附录说明 附录是对测试过程中涉及到的一些操作进行记录和解析。 oracle清除缓存 alter system flush shared_pool; 将使library cache和data dictionary cache以前保存的sql执行计划全部清空&#xff0c;但不会清空共享sql区或者共享pl/sql区里面缓存的最近被执行的条目。刷…

CEEMDAN-CPO-VMD二次分解(CEEMDAN+冠豪猪优化算法CPO优化VMD)

CEEMDAN-CPO-VMD二次分解&#xff08;CEEMDAN冠豪猪优化算法CPO优化VMD&#xff09; 目录 CEEMDAN-CPO-VMD二次分解&#xff08;CEEMDAN冠豪猪优化算法CPO优化VMD&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 首先运用CEEMDAN对数据进行一次分解&#xff…

UG NX二次开发(Python)-UIStyler-选取点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、设计一个UI界面3、创建长方体的代码4、需要引入的库5、测试验证1、前言 采用Python语言进行UG NX二次开发的资料比较少,我本来不是很认可采用Python进行二次开发的,但是近期有读者咨询…

后端-时间格式问题的解决办法

方法一&#xff1a;在需要的地方直接加 方法二&#xff1a;在全局写一个springmvc的消息转换器类

哪款云手机适合多开?常用云手机功能对比

在全球化和数字化时代&#xff0c;云手机以其独特的灵活性和高效性&#xff0c;成为多账号运营和数字营销的热门工具。云手机能够解决传统设备管理的诸多痛点&#xff0c;例如账号关联、硬件成本高等问题。本文将为您推荐多款优质云手机品牌&#xff0c;帮助您选择最适合的工具…

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面&#xff1a; 主页面&#xff1a; 添加信息&#xff1a; 删除信息&#xff1a; 删除第一行&#xff08;支持多行删除&#xff09; 需求分析&#xff1a; 用QT实现一个学生管理信息系统&#xff0c;数据库为MySQL 要求&#xf…

第三部分:进阶概念 7.数组与对象 --[JavaScript 新手村:开启编程之旅的第一步]

第三部分&#xff1a;进阶概念 7.数组与对象 --[JavaScript 新手村&#xff1a;开启编程之旅的第一步] 在 JavaScript 中&#xff0c;数组和对象是两种非常重要的数据结构&#xff0c;它们用于存储和组织数据。尽管它们都属于引用类型&#xff08;即它们存储的是对数据的引用而…

Redis设计与实现读书笔记

目录 Redis设计与实现[^1]第一部分&#xff1a;数据结构与对象简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希…

笔记04--零基础创建个人本地大模型知识库ollama+Dify

ollma安装 官网下载直接下一步下一步即可&#xff0c;没有魔法的朋友可以留言&#xff0c;文章中所用到的文件也给打包了&#xff0c;大家可以直接下载使用通过云盘下载使用。 链接: https://pan.baidu.com/s/12zF9MpQtg1bnMDAQayaSyg 提取码: n9rm 官网地址&#xff1a;http…

基于Springboot的校园交友网站设计与实现

1.1 管理信息系统概述 管理信息系统是计算机在信息管理领域的一种实用技术。通过运用管理科学、数学和计算机应用的原理及方法&#xff0c;在符合软件工程规范的原则下&#xff0c;形成一套完整的理论和方法体系。是一个以人、计算机和其他外部设备组成的可以进行信息的收集、…

Vue智慧商城项目

创建项目 vue组件库 — vant-ui&#xff08;常用于移动端&#xff09; Vant 2 - 轻量、可靠的移动端组件库 安装vant npm i vantlatest-v2 -S 引入组件 按需导入和全部导入 全部导入 整个组件库的所有组件都导进来&#xff0c;缺点是增加了代码包体积 main.js import…

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破

12月1日至2日&#xff0c;2024世界传感器大会&#xff08;WSS&#xff09;在郑州国际会展中心隆重举办&#xff0c;泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛&#xff0c;并在大会上带来《激光雷达用一体化光纤光源》专题演讲&#xff0c;同与…

【kotlin 】内联类(value class / inline class)

官方文档&#xff1a;https://kotlinlang.org/docs/inline-classes.html 注&#xff1a;inline class 关键字已经被废弃&#xff0c;取而代之的是value class。现在使用内联类需要定义类为value class&#xff0c;并使用JvmInline注解进行标注。 一、使用场景 有时候&#xff…

基于LSTM的A股股票价格预测系统(torch) :从数据获取到模型训练的完整实现

1. 项目简介 本文介绍了一个使用LSTM&#xff08;长短期记忆网络&#xff09;进行股票价格预测的完整系统。该系统使用Python实现&#xff0c;集成了数据获取、预处理、模型训练和预测等功能。 这个代码使用的是 LSTM (Long Short-Term Memory) 模型&#xff0c;这是一种特殊的…

【python自动化五】接口自动化基础--requests的使用

python的接口请求可以用requests库&#xff0c;这个介绍就不多说了&#xff0c;网上说得很详细。 接下来直接记录下如何使用&#xff08;当然也不限于自动化的使用&#xff09; 1.安装requests requests也需要安装一下 pip install requests2.requests请求 1.常用的请求方法…