UDP程序设计

2023-05-16

UDP套接口是无连接的、不可靠的数据报协议;既然他不可靠为什么还要用呢?
其一:当应用程序使用广播或多播时只能使用UDP协议;
其二:由于他是无连接的,所以速度快。
因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。

建立UDP套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口;由于UDP是无连接的,所以服务器端并不需要listen或accept函数。使用UDP套接字编程可以实现基于TCP/IP协议的面向无连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下图所示:

 

UDP客户/服务器的套接字函数

1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。

第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);


/*
 * Address families.
 */
#define AF_UNSPEC       0               /* unspecified */
#define AF_UNIX         1               /* local to host (pipes, portals) */
#define AF_INET         2               /* internetwork: UDP, TCP, etc. */
#define AF_IMPLINK      3               /* arpanet imp addresses */
#define AF_PUP          4               /* pup protocols: e.g. BSP */
#define AF_CHAOS        5               /* mit CHAOS protocols */
#define AF_IPX          6               /* IPX and SPX */
#define AF_NS           6               /* XEROX NS protocols */
#define AF_ISO          7               /* ISO protocols */
#define AF_OSI          AF_ISO          /* OSI is ISO */
#define AF_ECMA         8               /* european computer manufacturers */
#define AF_DATAKIT      9               /* datakit protocols */
#define AF_CCITT        10              /* CCITT protocols, X.25 etc */
#define AF_SNA          11              /* IBM SNA */
#define AF_DECnet       12              /* DECnet */
#define AF_DLI          13              /* Direct data link interface */
#define AF_LAT          14              /* LAT */
#define AF_HYLINK       15              /* NSC Hyperchannel */
#define AF_APPLETALK    16              /* AppleTalk */
#define AF_NETBIOS      17              /* NetBios-style addresses */
#define AF_VOICEVIEW    18              /* VoiceView */
#define AF_FIREFOX      19              /* FireFox */
#define AF_UNKNOWN1     20              /* Somebody is using this! */
#define AF_BAN          21              /* Banyan */

#define AF_MAX          22  

第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);


/*
 * Types
 */
#define SOCK_STREAM     1               /* stream socket */
#define SOCK_DGRAM      2               /* datagram socket */
#define SOCK_RAW        3               /* raw-protocol interface */
#define SOCK_RDM        4               /* reliably-delivered message */
#define SOCK_SEQPACKET  5               /* sequenced packet stream */  

如果套接口类型不是原始套接口,那么第三个参数就为0。

2、bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。


#include <sys/socket.h>  
 int bind(int sockfd, const struct sockaddr * server, socklen_t addrlen);
 //返回:0---成功   -1---失败   

第一个参数是socket函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。

3、recvfrom函数:UDP使用recvfrom()函数接收数据,他类似于标准的read(),但是在recvfrom()函数中要指明目的地址。


#include <sys/types.h>  
#include <sys/socket.h>  
 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr * from, size_t *addrlen);
 //返回接收到数据的长度---成功   -1---失败   

前三个参数等同于函数read()的前三个参数,flags参数是传输控制标志。最后两个参数类似于accept的最后两个参数。

4、sendto函数:UDP使用sendto()函数发送数据,他类似于标准的write(),但是在sendto()函数中要指明目的地址。

 


#include <sys/types.h>  
#include <sys/socket.h>  
 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr * to, int addrlen);
 //返回发送数据的长度---成功   -1---失败  

前三个参数等同于函数read()的前三个参数,flags参数是传输控制标志。参数to指明数据将发往的协议地址,他的大小由addrlen参数来指定。

参考程序(udpserver.c):

Linux下UDP服务器套接字程序,服务器接收客户端发送的信息并显示,同时显示客户的IP地址、端口号,并向客户端发送信息。如果服务器接收的客户信息为“bye”,则退出循环,并关闭套接字。


#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
 
#define PORT 1234
#define MAXDATASIZE 100
 
int main()
{
    int sockfd;
    struct sockaddr_in server;
    struct sockaddr_in client;
    socklen_t addrlen;
    int num;
    char buf[MAXDATASIZE];
 
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
    {
       perror("Creatingsocket failed.");
       exit(1);
    }
 
    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr.s_addr= htonl (INADDR_ANY);
    if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
    {
       perror("Bind()error.");
       exit(1);
    }   
 
    addrlen=sizeof(client);
    while(1)  
    {
       num =recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr*)&client,&addrlen);                                   
 
       if (num < 0)
       {
          perror("recvfrom() error\n");
          exit(1);
       }
 
       buf[num] = '\0';
       printf("You got a message (%s%) from client.\nIt's ip is%s, port is %d.\n",buf,inet_ntoa(client.sin_addr),htons(client.sin_port)); 
       sendto(sockfd,"Welcometo my server.\n",22,0,(struct sockaddr *)&client,addrlen);
       if(!strcmp(buf,"bye"))
       break;
    }
    close(sockfd);  
}
//执行命令./ udpserver,观察结果

参考程序(udpclient.c):

1、客户根据用户提供的IP地址将用户从终端输入的信息发送给服务器,然后等待服务器的回应。
2、服务器接收客户端发送的信息并显示,同时显示客户的IP地址、端口号,并向客户端发送信息。如果服务器接收的客户信息为“bye”,则退出循环,并关闭套接字。
3、客户接收、显示服务器发回的信息,并关闭套接字。


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
 
#define PORT 1234
#define MAXDATASIZE 100
 
int main(int argc, char *argv[])
{
    int sockfd, num;
    char buf[MAXDATASIZE];
 
    struct hostent *he;
    struct sockaddr_in server,peer;
 
    if (argc !=3)
    {
       printf("Usage: %s <IP Address><message>\n",argv[0]);
       exit(1);
    }
 
    if ((he=gethostbyname(argv[1]))==NULL)
    {
       printf("gethostbyname()error\n");
       exit(1);
    }
 
    if ((sockfd=socket(AF_INET, SOCK_DGRAM,0))==-1)
    {
       printf("socket() error\n");
       exit(1);
    }
 
    bzero(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr= *((struct in_addr *)he->h_addr);
    sendto(sockfd, argv[2],strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(server));
    socklen_t  addrlen;
    addrlen=sizeof(server);
    while (1)
    {
       if((num=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&peer,&addrlen))== -1)
       {
          printf("recvfrom() error\n");
          exit(1);
       }
       if (addrlen != sizeof(server) ||memcmp((const void *)&server, (const void *)&peer,addrlen) != 0)
       {
          printf("Receive message from otherserver.\n");
          continue;
       }
 
       buf[num]='\0';
       printf("Server Message:%s\n",buf);
       break;
    }
 
    close(sockfd);
}
//执行命令./ udpclient 127.0.0.1 hello

实验结果:

服务器端:

客户端:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP程序设计 的相关文章

  • 《C++ Primer Plus》第3章 处理数据 学习笔记

    C 43 43 的基本类型分为两组 xff1a 一组由存储为证书的值组成 xff0c 另一组由存储为浮点格式的值组成 整型之间通过存储键值时使用的呢存及有无符号来区分 整型从最小到最大依次是 xff1a bool char signed c
  • Microbit  Turnipbit  孩子也能做的声光控开关

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近一直在研究Turnipbit这块板子 xff0c 之前也做了几个小实验 xff0c 研究了下针脚 xff0c 发现光敏传感器和声音传感器针脚能对的上 xff0c 就做了
  • 串口通信的三种方式(查询、中断、DMA)

    PC机串口定义如下图 xff1a 一般的单片机串口应用只需3根信号线 xff1a 3脚TXD xff08 发送数据 xff09 2脚RXD xff08 接收数据 xff09 5脚SG xff08 信号地 xff09 其中单片机的TXD对应连
  • SQL SERVER 大小写敏感问题

    SQL SERVER大小写敏感问题 xff0c 其实是两个问题 xff1a 标识符 xff0c 例如表名和字段名 xff0c 是否区分大小写 xff1b 字符型字段进行比较时 xff0c 是否区分大小写 第一个问题 与SQL SERVER数
  • tcpreplay,tcprewrite

    安装指南 tcpreplay官方提供的下载地址为 http tcpreplay synfin net trac wiki Download 由于tcpreplay依赖libpcap库 所以安装tcpreplay之前必须先安装libpcap
  • 本文详解5G是个什么鬼,程序员都准备好了吗?

    无线移动通讯发展历史 最近5G的概念炒的如火如荼 xff0c 为此 xff0c 华为和高通还干了一仗 这篇文章从技术层面给大家分析 xff0c 什么是5G xff0c 它和4G比 xff0c 高级在哪里 xff1f 我们来看看移动互联网的技
  • python 调用 shell 时 设置环境变量

    2019独角兽企业重金招聘Python工程师标准 gt gt gt python调用shell 不设置shell的环境变量时 xff0c 对于中文等特殊字符会处理失败 xff0c 这时需要设置环境变量 调用shell xff0c 这里使用
  • 常用的ROS命令

    在这里记一下 xff0c 以免以后忘记了 打开ros master xff1a roscore 查看topic列表 xff1a rostopic list v 打印topic内容 xff1a rostopic echo topic 将bag
  • Rational Rose正逆向工程(类图转Java代码,Java代码转类图)

    xfeff xfeff 一 xff0c 正向工程 1 设置默认语言为Java xff0c Tools gt Options gt Notation gt default xff1a 选择Java 2 设置环境变量ClassPath xff0
  • Linux 下编译安装OpenCV

    Cmake的安装 OpenCV 2 2以后版本需要使用Cmake生成makefile文件 xff0c 因此需要先安装cmake ubuntu下安装cmake比较简单 xff0c apt get install cmake 如果觉得自带的版本
  • Python模块整理(三):子进程模块subprocess

    本来收集整理网络上相关资料后整理 xff1a 从python2 4版本开始 可以用subprocess这个模块来产生子进程 并连接到子进程的标准输入 输出 错误中去 xff0c 还可以得到子进程的返回值 subprocess意在替代其他几个
  • access$000方法和JAVA内部类的反编译

    反编译了几个内部类 xff0c 看到有对外部类access 000 access 100 access 200等方法的调用代码 xff0c 但反编译外部类时 xff0c 却看不到这些代码 这涉及到JAVA编译器中对内部类的处理方式 为了让内
  • c语言中寄存器设置方法,C 编程之——寄存器赋值操作

    通过这段时间的工作和学习 xff0c 我感觉在嵌入式硬件编程中 xff0c 大多数情况下都是对相应硬件的功能寄存器进行设置和操作 一 寄存器的设置和操作特性 1 xff0c 一个寄存器的每个位有其不同的意义 xff0c 进行不同的设置会使硬
  • 室内无人机全自动巡逻系统,或比固定摄像头省钱

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 两家欧洲公司开发了世界上第一款室内无人机监视自动巡逻系统 xff0c 可以实时转播录像 xff0c 并在发现入侵者时发出警报 无人机会在它所监测的建筑物的走廊和房间按照预定
  • 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...

    最主要的是学习什么课程 电工电路基础 低频电子线路 数字电路 高频电子线路 电子测量 智能仪器原理及应用 传感器技术 电机与电气控制 信号与系统 单片机接口原理及应用 等等 所要学习的科目当然不能定局 xff0c 知识面越广越好 xff0c
  • px4固定翼无人机姿态控制理解

    学习px4代码也有一段时间了 xff0c 所以想写一写 xff0c 自己的一些学习心得吧 xff0c 也算是笔记吧 在px4这套代码中 xff0c 每一个功能都是一个模块 xff0c 例如姿态控制 xff0c 也就是一个应用程序 xff0c
  • PHP 模拟 HTTP 摘要认证(Digest )

    lt php header 34 Content type text html charset 61 utf 8 34 php摘要认证 users 61 39 dee 39 61 gt 39 123456 39 39 admin 39 61
  • c语言中strcat函数的作用,strcat函数的作用是什么?

    strcat函数的作用是复制一个字符串 xff0c 将这个字符串拼接在另一个字符串后面 strcat 函数接受两个字符串作为参数 xff0c 会把第二个字符串的备份附加在第一个字符串末尾 xff0c 并把拼接后形成的新字符串作为第一个字符串
  • 带参数宏定义和函数的区别

    define S a b a b area 61 S 3 2 int S int a int b int s s 61 a b return s 这两个有什么区别 define S a b a b area 61 S 3 2 尽量少使用宏定
  • http协议调试代理工具Fiddler

    Fiddler是一款WEB调试工具 它可以记录所有客户端到服务器端的HTTP请求 Fiddler启动时 会默认代理IE浏览器的127 0 0 1 8888 其它浏览器则要手动设置 工作原理 Fiddler是以代理WEB服务器的形式工作的 它

随机推荐

  • Windows脚本中等待几秒的替代方法

    用ping命令实现等待 等待的秒数可以用 n 参数来控制 如果要等待10秒 xff0c 参数是 n 11 ping n 11 127 0 0 1 gt nul 64 more 64 来自 ITPUB博客 xff0c 链接 xff1a htt
  • http协议之digest认证实现

    参考 http blog csdn net jszj article details 8918967 https wenku baidu com view 22be2dcf83d049649b6658ff html http blog cs
  • 请求头authorization_postman教程-08-认证(Authorization)

    这又是一个非常实用的功能 对我们做接口测试来说 经常要处理登录认证的情况 如果不用这个Authorization其实也能解决认证的问题 无非就是把要认证的数据按照要求在指定位置传入参数即可 比如我们之前测试的系统 登录后返回的token要在
  • 字符串连接函数strcat

    C 43 43 宝典 第6章数组与字符串 xff0c 本章将介绍一种数据集合类型 数组 与结构体不同 xff0c 数组是同一类型数据的集合 而且在内存中 xff0c 数组中的元素依次排列 xff0c 一个紧邻一个 本节为大家介绍字符串连接函
  • Python3.x爬虫教程:爬网页、爬图片、自己主动登录

    林炳文Evankaka原创作品 转载请注明出处http blog csdn net evankaka 摘要 xff1a 本文将使用Python3 4爬网页 爬图片 自己主动登录 并对HTTP协议做了一个简单的介绍 在进行爬虫之前 xff0c
  • Flask 环境搭建

    引用自 xff1a https www cnblogs com rongtangzi p 6623122 html bin env python coding utf 8 describe this script shoud install
  • 转:vc中如何通过http的post方式上传文件

    文章引自 xff1a http blog myspace cn e 404248359 htm vc中如何通过http的post方式上传文件 HTTP响应 在接收和解释请求消息后 xff0c 服务器会返回一个HTTP响应消息 与HTTP请求
  • 奇偶校验

    奇偶校验有两种校验规则 xff1a 奇校验 xff1a 使完整编码 xff08 有效位和校验位 xff09 中的 34 1 34 的个数为奇数个 xff1b 偶校验 xff1a 使完整编码 xff08 有效位和校验位 xff09 中的 34
  • C++自定义file头文件

    2019独角兽企业重金招聘Python工程师标准 gt gt gt code ifndef SEAL FILEPOOL H define SEAL FILEPOOL H include 34 error h 34 include 34 ha
  • 锂电池主动均衡理解

    锂电池主动均衡方案总结 xff1a 来自 xff1a http wenku baidu com link url 61 EWiyACZ3aLPhcOjI4FZL3uQ9d0FD6dBhADQSVQiaSmRHHATTdSig1Wy39JY7
  • v$process.SPID 及 v$session.PROCESS的含义

    v session PROCESS Operating system client process ID Client side 是连接数据库的客户端程序的进程号 如果是WINDOWS client连接数据库 xff0c 则格式稍有不同 x
  • [Unity3D]矢量数学:向量的点乘(内积)和叉乘(外积)

    Unity使用左手坐标系 xff1a 拇指X轴 xff0c 食指Y轴 xff0c 中指Z轴 计算公式 xff1a 设 A Ax xff0c Ay xff0c Az B Bx xff0c By xff0c Bz xff0c 则 1 向量的模
  • itext 用的pom插件

    lt dependency gt lt groupId gt com itextpdf lt groupId gt lt artifactId gt itext asian lt artifactId gt lt version gt 5
  • Rplidar学习(三)—— ROS下进行rplidar调试

    一 建立工作空间 编译包 mkdir p catkin rplidar src 创建目录 cd catkin rplidar src 打开目录 下载rplidar ros数据包 xff0c 进行移动 git clone https gith
  • 数据包嗅探工具:HTTP请求/响应分析工具

    HTTPNetworkSniffer
  • RoboMaster 2017:机器人版的「王者农药」,工程师们的竞技时代

    8月6日晚 xff0c 第十六届全国大学生机器人大赛 RoboMaster 2017机甲大师赛在华润深圳湾体育中心 春茧 体育馆举行 xff0c 关于这个比赛的盛况已经无需赘述 xff0c 去年雷锋网参加上届比赛时 xff0c 报道的是 像
  • python popen.stdout.read阻塞 解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 需求 xff1a 利用python的subprocess模块结合logging模块实现监控子程序运行情况 代码如下 程序阻塞在stdout readz这里 xff0c 日志
  • Windows云服务器CPU使用率高的问题一例

    作者 xff1a 声东 大家好 xff0c 今天跟大家分享一例Windows云服务器CPU使用率高的问题 问题症状 客户购买了一台Windows 2016云服务器 xff0c 登录之后发现这台服务器的CPU使用率一直保持在90 以上 问题分
  • java 类知识_Java类基础知识

    同时按住Java中的Alt键和 39 39 键 xff0c Eclipse会给你代码提示 java 的几个基本概念 1 JVM java 虚拟机 运行java 程序的根本 2 JRE java 运行环境 xff0c java 虚拟机 43
  • UDP程序设计

    UDP套接口是无连接的 不可靠的数据报协议 xff1b 既然他不可靠为什么还要用呢 xff1f 其一 xff1a 当应用程序使用广播或多播时只能使用UDP协议 xff1b 其二 xff1a 由于他是无连接的 xff0c 所以速度快 因为UD