关于UDP服务器客户端编程流程介绍

 更新时间:2021年12月06日 10:08:12   作者:悲伤土豆拌饭  
大家好,本篇文章主要讲的是关于UDP服务器客户端编程流程介绍,感兴趣的同学赶快来看看吧,对你有帮助的话记得收藏

UDP编程流程

UDP提供的是无连接、不可靠的、数据报服务

在这里插入图片描述

UDP是尽最大能力进行传输,但是并不能保证可靠性,TCP的可靠性是因为一系列的机制保证可靠性,UDP丢包并不会重发,两种协议并没有优略之分,要区分不同的场景来区分,比如:进行文件传输,不能有数据丢失,TCP协议就更合

适,而进行实时视频通话,UDP会根据恒定的速率进行发送,这样的情况容许部分数据的丢失去追求更好的实时性,所以UDP更合适

流程:首先服务端与客户端都需要套接字的创建socket()(UDP并没有严格意义上的服务端与客户端),然后服务端需要确定ip与端口bind(),等待接收接收数据recvfrom()(会记录对方的ip和端口),在这里我们并没有跟某个客户端进行连接,只是接收发送过来的数据,客户端发送数据sendto()(需要指定ip与端口),因为UDP并不像TCP建立连接,通过文件描述符来识别客户端,只能通过发送与接收时识别ip与端口的方式来区分不同的数据,收发结束关闭套接字close()

UDP服务端代码实现

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

int main()
{
	//创建套接字
	//参数:
	//AF_INET ipv4
	//SOCK_DGRAM UDP使用的数据报服务类型 (SOCK_STREAM 流式套接字TCP使用的服务类型
	//标志位 一般给 0
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	assert(sockfd != -1);

	//创建套接字地址结构
	struct sockaddr_in saddr,caddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(6000);
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	//命名套接字
	int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
	assert(res != -1);

	while(1)
	{
		int len = sizeof(caddr);//这里专门存放在len中,是因为在recvfrom的时候接收一个指针
		char buff[128] = {0};

		//接受数据
		//参数:
		//服务端套接字
		//存放数据
		//存放大小
		//标志位 一般给0
		//存放客户端地址信息(ip与端口)
		//caddr的大小
		recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len);
		printf("buff=%s\n",buff);

		//发送数据
		//参数:
		//服务端套接字
		//发送的数据
		//发送数据大小
		//标志位 一般给0
		//发送目标的地址信息
		//地址信息的大小
		sendto(sockfd,"ok",2,0,(struct sockaddr*)&caddr,sizeof(caddr));
	}
	//关闭套接字
	close(sockfd);
}

UDP客户端代码实现

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

int main()
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	assert(sockfd != -1);

	//只需要指定服务器的ip与端口,客户端自己的ip与端口由系统自动指定
	struct sockaddr_in saddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(6000);
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	while(1)
	{
		char buff[128] = {0};
		printf("input:\n");
		fgets(buff,128,stdin);

		if(strncmp(buff,"end",3) == 0)
		{
			break;
		}

		sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)&saddr,sizeof(saddr));
		memset(buff,0,128);
		int len = sizeof(saddr);
		recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);
		//占用了saddr存放获取对方的ip与端口,实际上并没有改变都是一样的
		printf("buff=%s\n",buff);
	}
	close(sockfd);
}

UDP服务端客户端代码详解

执行服务端与客户端的代码

在这里插入图片描述

当我们打开多个窗口,启动多个客户端向服务端发送数据

在这里插入图片描述

UDP服务端的接收只是根据是否有数据发送过来,只要有发送过来的数据就进行接收,并不进行连接,即使将服务端关闭重新开启,使用原本的客户端依旧可以进行发送数据,因为他们本身之间并不存在相互的连接

在这里插入图片描述

假如将,服务端进行关闭不重启,客户端发送依旧发送出去sendto()不阻塞,但是会阻塞在recvfrom()这一步,简单的说就是服务器只管接收数据或者向发送方发送数据,无论是谁都可以向其发送数据且无需任何连接

如果我们将服务端代码进行修改

在这里插入图片描述

我们再通过客户端向服务端发送数据

在这里插入图片描述

使用UDP协议的时候,当数据传输过来我们将数据包拆开只读取设定大小的数据,其余就会丢掉,继而丢失

在这里插入图片描述

每次发送都是一个独立的数据包,因为每次的发送可能目的地址都不相同,对于TCP是可以将多次的数据合并进行发送的,因为在同一描述符同一连接内发送对象只有连接的另一方

到此这篇关于关于UDP服务器客户端编程流程介绍的文章就介绍到这了,更多相关UDP客户端编程程流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++代码操作MySQL数据库详细步骤

    C/C++代码操作MySQL数据库详细步骤

    这篇文章主要给大家介绍了关于C/C++代码操作MySQL数据库的相关资料,通过文中的这些示例,我们可以连接到MySQL数据库,并执行常见的数据库操作,如创建表、插入数据和查询数据,需要的朋友可以参考下
    2023-12-12
  • 解读C语言非void函数却没有return会怎么样

    解读C语言非void函数却没有return会怎么样

    这篇文章主要介绍了解读C语言非void函数却没有return会怎么样的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Visual Studio 2022使用MinGW来编译调试C/C++程序的图文教程

    Visual Studio 2022使用MinGW来编译调试C/C++程序的图文教程

    这篇文章主要介绍了Visual Studio 2022使用MinGW来编译调试C/C++程序,以实例来简单介绍一下VS2022中如何使用MinGW来编译、调试C/C++程序,需要的朋友可以参考下
    2022-08-08
  • EasyC++全局变量

    EasyC++全局变量

    这篇文章主要介绍了EasyC++全局变量
    2021-12-12
  • 一篇文章带你了解C语言--数据的储存

    一篇文章带你了解C语言--数据的储存

    这篇文章主要介绍了C语言数据的存储和取出详细讲解,作者使用图文代码实例讲解,有感兴趣的同学可以学习研究下,希望能给你带来帮助
    2021-08-08
  • 浅谈stringstream 的.str()正确用法和清空操作

    浅谈stringstream 的.str()正确用法和清空操作

    下面小编就为大家带来一篇浅谈stringstream 的.str()正确用法和清空操作。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C/C++中组合详解及其作用介绍

    C/C++中组合详解及其作用介绍

    这篇文章主要介绍了C/C++中组合的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 弦图ZOJ 1015 Fishing Net 判定方法

    弦图ZOJ 1015 Fishing Net 判定方法

    弦图,算法完全按照CDQ的PPT上给的最大势算法(MCS)完美消除序列..需要的朋友可以参考下
    2012-11-11
  • C语言Tinyhttpd服务器源码剖析

    C语言Tinyhttpd服务器源码剖析

    这篇文章主要为大家介绍了C语言Tinyhttpd服务器源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • C语言折半查找法介绍及使用示例

    C语言折半查找法介绍及使用示例

    折半查找法也叫做⼆分查找,顾名思义就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key,下面这篇文章主要给大家介绍了关于C语言折半查找法的相关资料,需要的朋友可以参考下
    2022-08-08

最新评论