实验平台

linux

实验内容

编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号。

实验原理

UDP是无需连接的通信,其主要实现过程如下:

同样,我们可以按照上一篇博客:基于TCP的客户端和服务器端的代码设计 的办法,将服务器代码分成两部分,一个是初始化,一个是收发数据。但是UDP服务器初始化较为简单,也可以直接写在main函数里。

UDP和TCP在读写数据上较为不同的是,sendto()和recvfrom(),这两个函数较为复杂。通过man手册查询得到:

ssize_t sendto(int sockfd, const void *buf, size_t len, intflags,const struct sockaddr *dest_addr, socklen_t addrlen);

参数1:文件描述符;  参数2:要发送的buf数据,是个指针

参数3:目的地的地址,是个指针,在使用时需要强制类型转换成(struct sockaddr *)  参数4:目的地的地址长度。具体的例子看下面代码

ssize_t recvfrom(int sockfd, void *buf, size_t len, intflags,struct sockaddr *src_addr, socklen_t *addrlen);

参数1:文件描述符;  参数2:要接收的buf缓冲区

参数3:接收的来源地址,在使用时需要强制类型转换成(struct sockaddr *)  参数4:一个指针,指向地址长度。具体的例子看下面代码

服务器端代码:udpserver.c

#include #include#include#include#include#include#include

#define BUFFER_SIZE 100

#define PORT 1234int32_t main(int32_t argc,char *argv[])

{structsockaddr_in server;structsockaddr_in client;charbuf[BUFFER_SIZE];

int32_t len= sizeof(client);

int32_t ret= 0;

int32_t file_len= 0;if (argc != 2)

{

printf("Usage ./server [ip]\n");return -1;

}

int32_t sockfd= socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0)

{

perror("create socket failed!");

exit(1);

}

bzero(&server, sizeof(structsockaddr_in));

server.sin_family=AF_INET;

server.sin_port= htons(PORT); /**< 主机字节序转化成网络字节序*/server.sin_addr.s_addr= inet_addr(argv[1]); /**< 字符串转换in_addr的函数*/

/**< 绑定服务器*/

if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)

{

perror("bind failed!");

exit(1);

}

ret= recvfrom(sockfd, buf, BUFFER_SIZE, 0, (struct sockaddr *)&client, &len);if (ret < 0)

{

perror("recvfrom failed!");

exit(1);

}

buf[ret]= '\0';

printf("client message: %s\n", buf);

printf("client's ip is %s, port is %d.\n", inet_ntoa(client.sin_addr), htons(client.sin_port));/**< 向客户端发送信息*/

if (sendto(sockfd, "Welcome to server", BUFFER_SIZE, 0, (struct sockaddr *)&client, len) < 0)

{

perror("send file len to client error");

}

close(sockfd);return 0;

}

客户端代码:udpclient.c

#include #include#include#include#include#include#include

#define BUFFER_SIZE 100

#define PORT 1234int32_t main(int argc,char *argv[])

{structsockaddr_in server;structsockaddr_in peer;charbuf[BUFFER_SIZE];

int32_t len= sizeof(peer);char sendbuf[BUFFER_SIZE] = "welcome to client";

int32_t num= 0;if (argc != 2)

{

printf("Usage ./client ip\n");

exit(1);

}int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0)

{

perror("create socket failed!");

exit(1);

}

bzero(&server, sizeof(structsockaddr_in));

server.sin_family=AF_INET;

server.sin_port=htons(PORT);

server.sin_addr.s_addr= inet_addr(argv[1]);if (sendto(sockfd, sendbuf, BUFFER_SIZE, 0, (struct sockaddr *)&server, sizeof(server)) < 0)

{

perror("sendto socket failed!");

exit(1);

}if ((num = recvfrom(sockfd, buf, BUFFER_SIZE, 0, (struct sockaddr *)&peer, &len)) < 0)

{

perror("recvfrom socket failed!");

exit(1);

}

buf[num]= '\0';

printf("Server Message: %s\n", buf);

close(sockfd);return 0;

}

Makefile

all:server client

server:udpserver.c

gcc udpserver.c-o server

client:udpclient.c

gcc udpclient.c-o client

clean:

rm-rf server client

实验结果

c udp文件发送到服务器端,基于UDP的客户端和服务器端的代码设计相关推荐

  1. java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...

  2. java基于http协议客户端与服务器端的交互,通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分...

    经 常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化.于是就按照在 Servlet 里面的内容大致做了一些穿插.本来 连 Tomcat 容器 和 S ...

  3. java udp 工具类_java基于UDP实现图片群发功能

    UDP协议(用户数据报协议)是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但是这两个Socket之间并没有虚拟链路,这两个Socket只是发送,接收数据报的对象. UDP的优缺点: ...

  4. android局域网udp视频对讲,Android基于UDP语音对讲系列(一)

    Android 两部手机通过UDP在局域网内通信 最近学习了一下socket通信相关的知识,决定从UDP进行文字传输开始做起.华为手机效果如图: 我的另一部是小米手机:网络IP为192.168.1.1 ...

  5. 墨麟科技Java服务器_基于TCP的客户端和服务器端的代码设计

    实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...

  6. 基于C语言的可靠数据传输协议的设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/86799219 资源下载地址:https://download.csdn.net/downl ...

  7. 基于freeswitch+linphone客户端开发对讲系统

    基于freeswitch+linphone客户端开发对讲系统 基本思路: freeswitch开启conference call (3100), 并进行一些配置(例如,没有moh,刚刚进入时静音禁止视 ...

  8. Java通过socket实现客户端和服务器端的通信

    在学习Java的socket通信时,老师布置的一道作业题,借此机会也对相关的知识进行梳理,题目如下: 编写客户服务器端程序,使用Socket技术实现通信,双方约定通信端口为6789.服务器端功能:当收 ...

  9. Java实现客户端同步服务器端的数据

    用户在服务器web前端增加.修改.删除了数据后会导致客户端的数据与服务器端的数据不一致.为了能够使客户端和服务器端的数据一致,客户端需要同步服务器端的这些操作.主要的步骤为:"服务器端修改数 ...

最新文章

  1. 智能循迹避障小车C语言程序编写思路,设计一个循迹避障一体的智能小车的资料和代码及电路图详细概述...
  2. 【OpenCV学习笔记之一】图像加载,修改及保存
  3. RTSP流媒体数据传输的两种方式(TCP和UDP)
  4. 客户端命令(docker)
  5. 如何用Python的pyecharts库绘制K线图
  6. redis 如何 mysql_Redis 如何保持和 MySQL 数据一致
  7. 一步步yum安装LNMP,脱坑笔记!!!
  8. 20张可视化大屏,给数据分析师最全的大屏模板!无代码直接套用
  9. oracle——监听(一、多实例监听配置)
  10. 树莓派3代b型静态IP设置,和ssh的wlan配置
  11. paip.JAVA的优缺点相比C#.NET VC425
  12. 《重构 改善既有代码的设计》笔记
  13. oracle dat 文件怎么打开,DAT后缀的文件是用什么软件打开的呢?
  14. 2020-10-28网络安全之网络安全产品
  15. coreldraw x4最新精简中文矢量绘图软件
  16. Chrome浏览器安装Axure插件
  17. uniapp H5文件预览,PDF预览
  18. 复杂美区块链专利再获外媒关注
  19. 第7章 区块链开发平台:超级账本
  20. mscorsvw.exe是windows的什么进程!!

热门文章

  1. 敏捷项目管理21天学习计划--敏捷生命周期
  2. 【CSS】页面背景的毛玻璃效果
  3. 从红海里面寻找蓝海,看一个人的思维模式
  4. java中常见的设计模式有那些?
  5. 公司常用协同管理软件介绍
  6. 判断用户是否登录成功
  7. EXPLAIN 使用
  8. vue打包导致浏览器崩溃的解决方法
  9. html div文字竖向显示,css怎么让文字竖着?
  10. iVMS-4200 Vs区别_34973足球推荐分析 英冠 03:45 布伦特福德 VS 诺维奇