UDP服务器端和客户端程序设计

2023-05-16

实验三 UDP服务器端程序设计

一、实验目的

学习和掌握Linux下的UDP服务器基本原理和基本编程方法,体会与TCP的区别,TCP编程:http://blog.csdn.net/yueguanghaidao/article/details/7035248

二、实验平台

ubuntu-8.04操作系统

三、实验内容

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

四、实验原理

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

建立UDP套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口;由于UDP是无连接的,所以服务器端并不需要listen或accept函数。

使用UDP套接字编程可以实现基于TCP/IP协议的面向无连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图3.1所示。


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


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

-----------------------------------------------------------------
 #include <sys/socket.h>
 int socket(int family,int type,int protocol);    
      返回:非负描述字---成功   -1---失败
 -----------------------------------------------------------------

第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为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参数来指定。


五、实验步骤

1、登陆进入ubuntu操作系统,新建一个文件,命名为udpserver.c(为了方便起见,可以进入“home”,再进入用户目录,在用户目录下新建udpserver.c)。

2、在udpserver.c中编写服务器端程序代码并保存。

3、在“终端”(“Applications”→“附件”→“终端”)中执行命令进入udpserver.c所在目录。(pwd命令可以显示当前所在目录;ls命令可以显示当前目录下的文件和文件夹信息;cd..命令可以进入上一级目录;cd 目录名 命令可以进入当前所示的某个目录。)

4、执行命令gcc –o udpserver udpserver.c生成可执行文件udpserver。

5、执行命令./ udpserver,观察结果。

6、认真分析源代码,体会如何编写一个UDP服务器端程序。

 

六、参考程序(udpserver.c

 #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
 
       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);  
       }


      实验四 UDP客户端程序设计

一、实验目的

学习和掌握Linux下的UDP客户端基本原理和基本编程方法。

二、实验平台

ubuntu-8.04操作系统

三、实验内容

编写Linux下UDP客户端套接字程序,结合实验三的UDP服务器端程序,实现以下功能:

1、客户根据用户提供的IP地址将用户从终端输入的信息发送给服务器,然后等待服务器的回应。

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

3、客户接收、显示服务器发回的信息,并关闭套接字。

四、实验原理

见实验三的实验原理部分。

五、实验步骤

1、登陆进入ubuntu操作系统,新建一个文件,命名为udpclient.c(为了方便起见,可以进入“home”,再进入用户目录,在用户目录下新建udpclient.c)。

2、在udpclient.c中编写客户端程序代码并保存。将实验三完成的udpserver.c拷贝到与udpclient.c同一目录下。

3、在“终端”(“Applications”→“附件”→“终端”)中执行命令进入udpserver.c和udpclient.c所在目录。

4、执行命令gcc –o udpserver udpserver.c生成可执行文件udpserver。

5、执行命令./ udpserver。

6、再开一个“终端”,进入udpserver.c和udpclient.c所在目录,执行命令

gcc–o udpclient udpclient.c生成可执行文件udpclient。

7、执行命令./ udpclient 127.0.0.1 hello。

8、观察两个“终端”出现的结果。

9、在客户端终端下执行命令./ udpclient 127.0.0.1 bye。

10、观察两个“终端”出现的结果。

11、认真分析源代码,体会如何编写一个UDP客户端程序。

 

六、参考程序(udpclient.c

     

  #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);
       }

UDP实验结果:

服务器端:


客户端:



好好体会UDP与TCP编程的区别,TCP服务器端和客户端编程:http://blog.csdn.net/yueguanghaidao/article/details/7035248














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

UDP服务器端和客户端程序设计 的相关文章

  • Android udp 多播与以太网

    大家好 我正在开发一个使用 udp 多播的项目 我有一台服务器通过以太网电缆发送多播 udp 数据包 我花了几周的时间阅读有关 android 上多播的所有帖子 但我仍然无法在我的 Asus Transformer Tablet 4 1 上
  • UDP 服务器套接字缓冲区溢出

    我正在 Linux 上编写 C 应用程序 我的应用程序有一个 UDP 服务器 它在某些事件上向客户端发送数据 UDP 服务器还接收来自客户端的一些反馈 确认 为了实现这个应用程序 我使用了一个 UDP 套接字 例如int fdSocket
  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • 从 ANDROID 2.2 发送 UDP 包(HTC 希望)

    我有一个局域网 我想从我的 android htcdesire 发送一条 udp 消息到我的电脑 它们之间有一个 WLAN 路由器 问题是 UPD 消息永远不会到达 PC Android上的代码 package org example an
  • 数据报总是被完整接收吗?

    大多数数据报接收函数 例如c的recv或read java的DatagramPacket类或python的SocketServer 都包含找出接收数据量的可能性 c int amount recv sock buf n MSG WAITAL
  • 如何在多个程序中接收相同的udp流?

    我有一个封闭的第三方系统 它发送单播 UDP 流 MPEG TS 我想在同一台计算机上的两个不同程序中访问该流 我无法更改源上的任何内容 甚至无法更改 IP 或端口 除了编写自己的小程序来捕获流然后创建新流并重新发送这两个流之外 还有其他选
  • 错误的 UDP 校验和没有效果:为什么?

    我正在尝试测试 UDP 程序 如果它接收到 UDP 校验和错误的数据 会发生什么情况 奇怪的是 它似乎没有任何效果 并且有效负载被成功接收 至少在 OS X 上是通过环回接口成功接收的 下面是一个示例 其中使用以下方式发送数据SOCK RA
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • DatagramChannel.close() 在 Windows 上保持端口打开

    我正在实施一个发现流程 打开 UDP 套接字以侦听给定端口上的广播响应 发送一些请求 并期待稍后的响应 在给定时间段后关闭 UDP 套接字 第一次通话有效 但其他调用会出现绑定错误 地址已被使用 绑定 我运行的是Windows 7 我做了一
  • Go:如何接收整个 UDP 数据报

    我的问题 使用 net Read 方法仅复制给定字节数组或切片大小的字节数 当然 我不想每次都分配最大 64 kB 的 UDP 数据报 有没有go如何确定数据报的大小 位于数据报头中 或再次读取直到数据报完全读取 Try 从UDP读取 ht
  • 什么是消息边界?

    什么是 消息边界 在以下情况下 TCP 和 UDP 之间的区别之一是 UDP 保留消息 边界 我理解之间的区别TCP and UDP 但我不确定的定义 消息边界 由于 UDP 在每个单独的数据包中包含目的地和端口信息 因此是否可以为消息提供
  • 我刚刚在哪个适配器上收到此 UDP 数据包?

    我正在尝试用 C 编写一个 BOOTP 服务器 我正在接收并解析来自客户端的 BOOTP 数据包 我需要回复我的服务器 IP 地址 问题是 计算机可以有多个网络适配器 客户端还没有 IP 地址 有什么方法可以查出 UDP 数据包是在哪个适配
  • 使用 STUN 打孔

    我目前正在尝试通过 Internet 发送 UDP 消息 并且必须为端点 A 和 B 都位于 NAT 后面 设置防火墙 为此 我想使用 STUN 服务器进行打孔 当 A 创建对 STUN 服务器的请求 例如 私有 85 1 1 12 600
  • 在 PowerShell 中通过 UDP 发送和接收数据

    我正在尝试编写一个脚本来使用 PowerShell 进行测试和应用 测试应包括通过 UDP 向远程服务器发送字符串 然后读取该服务器的响应并对结果执行某些操作 我需要的唯一帮助是脚本的中间两个步骤 发送字符串 然后 接收响应 在端口 UDP
  • Node.js 可读流_read用法

    我了解如何在 Node 的 new 中使用可写流Streams2库 但我不明白如何使用可读流 举个例子 一个流包装器围绕dgram module var dgram require dgram var thumbs twiddle func
  • 错误号:11,资源暂时不可用

    我正在使用 c 套接字来实现可靠的 UDP 协议 我正在使用以下代码在等待确认的套接字上设置超时 我不确定为什么会收到 errno 11 资源暂时不可用 set timer for recv socket struct timeval tv
  • 从不同进程通过套接字 (UDP) 回复客户端

    我有一个服务器而不是 命令处理程序 进程 它通过 UDP 接收消息 并通过其发布的 API 无论该进程采用何种 IPC 机制 与该进程进行通信 从而将要做的工作委托给不同的进程 我们的系统有多个协作进程 然后 该 API 调用的结果会从命令
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • 无法从 run 方法中访问对象的属性(方法)! Java多线程

    我在 ServerConnectionManager 中有以下代码 public class ServerConnectionManager implements Runnable private DatagramPacket receiv
  • 跨 NAT 的 UDP 客户端无法从服务器接收数据

    我正在尝试在服务器 在公共 IP 上 和客户端 跨 NAT 之间使用 UDP 进行双向通信 我的逻辑是 如果服务器将一些数据发送到 IP 和它接收数据包的端口 客户端仍然应该收到它 因为 NAT 将具有最终将数据包发送到客户端的映射 客户端

随机推荐

  • 查看静态库(.lib)和动态库(.dll)的导出函数的信息

    一般情况下 xff0c 我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息 xff0c 可以使用VS自带的工具dumpbin xff1b 可以直接在命令行下输入dumpbin就可以查看他的使用说明 xff0c 如果未显示
  • do {...} while (0) 在宏定义中的作用

    http www cnblogs com lanxuezaipiao p 3535674 html 如果你是一名C程序员 xff0c 你肯定很熟悉宏 xff0c 它们非常强大 xff0c 如果正确使用可以让你的工作事半功倍 然而 xff0c
  • Nginx 代理服务器10k文件无法上传

    在我们使用Nginx作为代理服务器的时候 xff0c 在进行文件上传时 xff0c 大于10k的文件上传失败 xff0c 因为此时后台服务并没有接收到请求 xff0c 所以在Nginx配置中进行排错 xff0c 终于找到了问题所在 1 修改
  • 即插即用型设备驱动的加载过程

    现假设驱动程序已被正确安装 xff1a 1 某种PnP总线驱动发现了即插即用设备的存在 xff1a 对于热插拔设备 xff0c 则发现过程发生于插入设备的瞬间 xff1b 如果是非热插拔设备 xff0c 则发现过程发生于系统启动时 2 Pn
  • EXCEL 基于合并计算工具实现相似表格汇总和求平均值

    1 表格汇总合并 在处理大量表格时 xff0c 有时候需要将很多相思内容的表格 xff0c 合并到一张表里 xff0c 那么就需要用到 合并计算工具 了 如下表所示为某公司南京分部的BCD产品的销售额 通过下表可以知道还有海口 上海 珠海三
  • ZYNQ7020AMP使用方法总结

    本人使用的sdk版本为2015 4本人的方法适用于15 4之后的版本 Zynq开发双核分为两种方法 xff0c 第一种双核裸跑 xff0c 第二种linux 43 裸跑 双核裸跑 xff1a 先使用Debug调试器调试 xff0c 通过SD
  • 试用了5款BI分析工具,终于找到了上手最快的那一个!

    前几天 xff0c 领导甩给我一个任务 xff0c 考察几个BI工具 xff0c 下季度立项用 潜心做ETL的我 xff0c 对BI只是略懂 之前上的BO xff0c 由于开发模式不适应 人员用不惯 xff0c 再加上负责这块的同事走的走
  • RNA-seq流程——使用hisat2进行序列比对(不利用循环&利用循环)(未完待续)

    RNA seq流程 使用hisat2进行序列比对 xff08 不利用循环 xff06 利用循环 xff09 xff08 未完待续 xff09 本次使用ky老师的文件进行序列比对 xff0c 比对时使用双端比对 xff0c 1 clean f
  • JavaWeb学习jsp中,单击验证码图片进行替换

    lt td gt 验证码 lt td gt lt td class 61 34 inputs 34 gt lt input name 61 34 checkCode 34 type 61 34 text 34 id 61 34 checkC
  • Linux的FTP安装、使用和配置(FTP客户端管理工具)

    一 FTP服务介绍 1 什么是HTP服务 FTP xff08 File Transfer Protocol xff09 是一种应用非常广泛并且古老的一个互联网文件传输协议 FTP主要用户互联网中文件的双向传输 xff08 上传 下载 xff
  • 详解警告“unreferenced local variable”

    在编译C 43 43 程序时 xff0c 我们有时候遇到这样的警告 warning C4101 39 x1 39 unreferenced local variable 下面是一个会出现上述警告的简单例子 xff1a using names
  • 为Github page绑定自定义域名并实现https访问

    欢迎参观我的网站 gt Yuci s Blog 实现目标 获取自定义域名yucichueng me 将上述域名 及www域名 解析到yucichueng github ioIP地址 将域名解析服务托管于CloudFlare 获取SSL证书
  • [NFC]NFC 客户 Support 流程

    驱动部分问题 测试程序用法再还未移植上层内容前执行测试程序后 NoACK不慎移植了上层后但还未确认底层是否移植成功需要先删除移植上层所产生的内容设备节点权限海思平台的驱动问题64位平台问题想用 NXP CLK 控制 PMIC 的 CLK安全
  • win10 文件夹背景 win10教程

    韩梦飞沙 韩亚飞 313134555 64 qq com yue31313 han meng fei sha 如何修改Windows10文件夹背景色 百度经验 Windows 10 文件夹背景 xff08 资源管理器中 xff09 如何更改
  • SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

    前言 好久没有写文章了 xff0c 前段时间由于公司项目比较忙 xff0c 因此耽搁了一些时间 本篇文章也是本头条号转正后发的第一篇文章 xff0c 在此跟各位看官道歉 xff0c 同时也感谢各位看官的不离不弃 希望各位看官可以关注本头条号
  • Jackson多态反序列化的使用

    缘起 最近看Apache Druid的源代码 0 5很老的版本 xff0c 印象最深的就是对Jackson的多态反序列化和注入的使用了 xff0c 这里也属于自己的知识盲点 xff0c 看着复杂的json直接反序列化为可用对象 xff0c
  • Apache Druid源码导读--Google guice DI框架

    文章目录 缘起Google Guice介绍与Spring的对比Example覆盖已有绑定关系默认绑定 Apache Druid中Guice模块guice lifecycleguice jsonconfigguice jersey jetty
  • [gevent源码分析] 深度分析gevent运行流程

    一直对gevent运行流程比较模糊 xff0c 最近看源码略有所得 xff0c 不敢独享 xff0c 故分享之 gevent是一个高性能网络库 xff0c 底层是libevent xff0c 1 0版本之后是libev xff0c 核心是g
  • TCP服务器端和客户端程序设计

    一 实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法 体会TCP与UDP编程的不同 xff0c UDP编程 xff1a http blog csdn net yueguanghaidao article details
  • UDP服务器端和客户端程序设计

    实验三 UDP服务器端程序设计 一 实验目的 学习和掌握Linux下的UDP服务器基本原理和基本编程方法 xff0c 体会与TCP的区别 xff0c TCP编程 xff1a http blog csdn net yueguanghaidao