基于UDP的客户端和服务器端的代码设计
实验平台
linux
实验内容
编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号。
实验原理
UDP是无需连接的通信,其主要实现过程如下:

同样,我们可以按照上一篇博客:基于TCP的客户端和服务器端的代码设计 的办法,将服务器代码分成两部分,一个是初始化,一个是收发数据。但是UDP服务器初始化较为简单,也可以直接写在main函数里。
UDP和TCP在读写数据上较为不同的是,sendto()和recvfrom(),这两个函数较为复杂。通过man手册查询得到:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
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, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
参数1:文件描述符; 参数2:要接收的buf缓冲区
参数3:接收的来源地址,在使用时需要强制类型转换成(struct sockaddr *) 参数4:一个指针,指向地址长度。具体的例子看下面代码
服务器端代码:udpserver.c
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> #define BUFFER_SIZE 100
#define PORT 1234 int32_t main(int32_t argc,char *argv[])
{
struct sockaddr_in server;
struct sockaddr_in client;
char buf[BUFFER_SIZE];
int32_t len = sizeof(client);
int32_t ret = ;
int32_t file_len = ; if (argc != )
{
printf("Usage ./server [ip]\n");
return -;
}
int32_t sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < )
{
perror("create socket failed!");
exit();
} bzero(&server, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(PORT); /**< 主机字节序转化成网络字节序 */
server.sin_addr.s_addr = inet_addr(argv[]); /**< 字符串转换in_addr的函数 */ /**< 绑定服务器 */
if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < )
{
perror("bind failed!");
exit();
} ret = recvfrom(sockfd, buf, BUFFER_SIZE, , (struct sockaddr *)&client, &len);
if (ret < )
{
perror("recvfrom failed!");
exit();
}
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, , (struct sockaddr *)&client, len) < )
{
perror("send file len to client error");
} close(sockfd);
return ;
}
客户端代码:udpclient.c
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> #define BUFFER_SIZE 100
#define PORT 1234 int32_t main(int argc,char *argv[])
{
struct sockaddr_in server;
struct sockaddr_in peer;
char buf[BUFFER_SIZE];
int32_t len = sizeof(peer);
char sendbuf[BUFFER_SIZE] = "welcome to client";
int32_t num = ; if (argc != )
{
printf("Usage ./client ip\n");
exit();
}
int sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < )
{
perror("create socket failed!");
exit();
}
bzero(&server, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(argv[]); if (sendto(sockfd, sendbuf, BUFFER_SIZE, , (struct sockaddr *)&server, sizeof(server)) < )
{
perror("sendto socket failed!");
exit();
} if ((num = recvfrom(sockfd, buf, BUFFER_SIZE, , (struct sockaddr *)&peer, &len)) < )
{
perror("recvfrom socket failed!");
exit();
} buf[num] = '\0';
printf("Server Message: %s\n", buf); close(sockfd); return ;
}
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
实验结果


基于UDP的客户端和服务器端的代码设计的更多相关文章
- 基于TCP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...
- UDP广播的客户端和服务器端的代码设计
实验环境 linux 注意: 使用UDP广播,是客户端发送广播消息,服务器端接收消息.实际上是客户端探测局域网中可用服务器的一种手段.客户端发送,服务器端接收,千万不能弄混淆!!! 为了避免混淆,本文 ...
- C/S模型:TCP,UDP构建客户端和服务器端(BIO实现
Java中提供了socket编程来构建客户端和服务器端 TCP构建服务器端的步骤:(1)bind:绑定端口号(2)listen:监听客户端的连接请求(3)accept:返回和客户端连接的实例(4)re ...
- 基于UDP传输协议局域网文件接收软件设计 Java版
网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...
- 基于TCP的客户端、服务器端socket编程
一.实验目的 理解tcp传输客户端服务器端通信流程 二.实验平台 MAC OS 三.实验内容 编写TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并 ...
- 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写
1. 在原服务端项目 ws_server中添加两个bean 1.1 添加两个类 User 和 Clazz package com.lonely.pojo; public class User { ...
- QT 使用QUdpSocket QUdpServer UDP 建立客户端与服务器端
1. 模拟天气监控,每隔两秒从Server发送天气信息到Client. 2. 示例代码 --------------------------- Server 端 ------------------- ...
- 计算机网络课设之基于UDP协议的简易聊天机器人
前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...
- 【TCP/IP网络编程】:06基于UDP的服务器端/客户端
本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先 ...
随机推荐
- C语言 文件操作(二)
1.fputc(); fputc 是 file output char 的所以,意思是向指定的文件中写入一个字符.fputc() 的用法为: int fputc ( int ch, FILE *fp ...
- C语言中 sinx cosx 的用法
#include<stdio.h> #include<math.h> int main() { double pi=acos(-1.0); double ang ...
- matplotlib BlendedAffine2D 和 CompositeAffine2D
2020-04-11 10:00:01 --Edit by yangrayBlendedAffine2D 继承于Affine2DBase,支持x和y方向使用不同的仿射变换策略.(自译:混合仿射变换)C ...
- 数据结构和算法(Golang实现)(17)常见数据结构-树
树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合. 树的定义: 有节点间的层次关系,分为父节点和子节点. 有唯一一个根节点,该根节点没有父节点. 除了根节点,每个节点有且只有 ...
- 关于连接内部服务器以及redis缓存基本操作
1.linux命令行远程连接内部服务器 ssh -p 6637 mndevops@172.18.11.183 //建立连接命令 端口号和用户名+ip 输入密码 ./redis-cli 进入redis数 ...
- 使用 Chrome 插件 Vimium 打造黑客浏览器
之前一直用 cVim,与 Vimium 功能类似,但是之后不在更新了,故转战到 Vimium. 简介 官网:http://vimium.github.io/ Vimium 是 Google Chrom ...
- 怎样才能拥有营销号生成器功能?python帮你实现
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- 腾讯云集群服务部署mysql并挂载到服务器
一.背景 由于现在大部分的应用都是运行在云服务器上的,而现在大多数文章都是主要写如何在服务器上使用docker去运行mysql,比较少有介绍云服务器上的.再加上现在k8s比较火爆,而云厂商大多数都提供 ...
- CoreDNS解析异常记录
CoreDNS解析异常记录 异常情况:集群是用kubespray部署的4个worknode,coredns默认部署2个deployment.今天发现部署了coredns的node上的pod正常解析内部 ...
- js的localStorage基础认识
新建a.html文件: <!DOCTYPE html> <html> <body> <div id="result"></di ...