【UDP回声服务器】一篇文章搞懂UDP与TCP的区别,并且实现UDP的回声服务器

笔者上一篇的文章总结的TCP通信协议的特点与TCP回声服务器的代码实现,所以这一次,再对UDP通信协议进行一次总结

1、UDP回声服务器的概念

1.1 什么是UDP?

  UDP 的全称为用户数据报协议(UDP, User Datagram Protocol) 它是一个无连接的传输协议.UDP为应用程序提供了一种无需连接就可以发送封装的IP数据包的方法。

1.2 什么是回声服务器?

  回声服务器是指一种收到客户端发送的消息后,将消息回传至客户端服务器,这种服务器代码简单,但功能健全,非常适合帮助初学者理解网络编程中UDP通信协议。

2、UDP与TCP的区别

笔者在此总结一张表概括UDP与TCP的区别

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一
传输方式面向报文面向字节流
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

3、UDP回声服务器的编程模型

3.1 编程模型

服务器端 S客户端 C
创建套接字socket创建套接字socket
准备通信地址(服务器的地址)准备通信地址(服务器的地址)
绑定套接字和通信地址连接服务器端S
接收/发送数据发送/接收数据
关闭套接字关闭套接字

3.2 服务器端编程步骤

  //创建套接字

  //准备通信地址

  //绑定socket与通信地址

  //接收数据,将接收到的数据存入缓冲区

  //发送数据,将缓冲区的数据发送出去

  //关闭套接字

3.3 客户端编程步骤

  //创建套接字

  //准备通信地址

  //发送数据

  //接收数据

  //关闭套接字

4、代码实现

4.1 服务器端代码实现

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

typedef struct sockaddr* SP;

int main(int argc,const char* argv[])
{
	// 创建socket对象 
	int svr_sock = socket(AF_INET,SOCK_DGRAM,0);
	if(0 > svr_sock)
	{
		perror("socket");
		return EXIT_FAILURE;
	}

	// 准备通信地址(自己的)
	struct sockaddr_in svr_addr = {} , cli_addr = {};
	svr_addr.sin_family = AF_INET;
	svr_addr.sin_port = htons(1324);
	svr_addr.sin_addr.s_addr = inet_addr("192.168.0.113");
	socklen_t addrlen = sizeof(svr_addr);

	// 绑定地址与socket对象
	if(bind(svr_sock,(SP)&svr_addr,addrlen))
	{
		perror("bind");
		return EXIT_FAILURE;
	}

	char buf[4096] = {};
	size_t buf_size = sizeof(buf);

	for(;;)
	{
		// 接收数据和来时的地址
		size_t ret_size = recvfrom(svr_sock,buf,buf_size,0,(SP)&cli_addr,&addrlen);	
		if(0 >= ret_size)
		{
			perror("recvfrom");
			// 关闭socket对象
			close(svr_sock);
			return EXIT_FAILURE;
		}
		printf("from:%s recv:[%s] bits:%d\n",inet_ntoa(cli_addr.sin_addr),buf,ret_size);
		sprintf(buf,"return:%s",inet_ntoa(svr_addr.sin_addr));
		// 返回数据
		sendto(svr_sock,buf,strlen(buf)+1,0,(SP)&cli_addr,addrlen);
	}
}

4.2 客户端代码实现

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

typedef struct sockaddr* SP;
int main(int argc,const char* argv[])
{
	// 创建socket对象
	int is_broadcast = 1;
	int cli_sock = socket(AF_INET,SOCK_DGRAM,0);
	if(0 > cli_sock)
	{
		perror("socket");
		return EXIT_FAILURE;
	}
	setsockopt(cli_sock,SOL_SOCKET,SO_BROADCAST,&is_broadcast,sizeof(is_broadcast));

	// 准备通信地址(服务端的)
	struct sockaddr_in svr_addr = {};
	svr_addr.sin_family = AF_INET;
	svr_addr.sin_port = htons(1324);
	svr_addr.sin_addr.s_addr = inet_addr("192.168.0.255");
	socklen_t addrlen = sizeof(svr_addr);

	char buf[4096] = {};
	size_t buf_size = sizeof(buf);

	for(;;)
	{
		printf(">>>");
		gets(buf);
		if(0 == strcmp("quit",buf))
		{
			printf("退出通信!\n");
			close(cli_sock);
			return EXIT_SUCCESS;
		}

		// 向服务器发送数据
		sendto(cli_sock,buf,strlen(buf)+1,0,(SP)&svr_addr,addrlen);
		// 从服务器接收数据
		size_t ret_size = recvfrom(cli_sock,buf,buf_size,0,(SP)&svr_addr,&addrlen);
		if(0 >= ret_size)
		{
			perror("recvfrom");
			// 关闭socket对象
			close(cli_sock);
			return EXIT_FAILURE;
		}
		printf("from:%s recv:[%s] bits:%d\n",inet_ntoa(svr_addr.sin_addr),buf,ret_size);
	}
}

5、结尾

  笔者在本文中总结了UDP通信协议与TCP通信协议的区别,同时用代码具体实现了基于UDP通信协议的回声服务器,通过阅读本文,相信一定能帮助读者更加形象的了解TCP/UDP两种通信协议。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt实现TCPUDP服务器和客户端非常简单。Qt提供了丰富的网络功能,可以轻松地创建和管理TCPUDP连接。 要实现一个TCP服务器,首先需要创建一个QTcpServer对象,并监听一个特定的端口。然后,使用QTcpServer的newConnection()信号连接一个槽函数,当有新的连接请求时,就会触发这个槽函数。在槽函数中,可以使用nextPendingConnection()函数接受连接,并创建一个QTcpSocket对象来处理与客户端的通信。 要实现一个TCP客户端,只需创建一个QTcpSocket对象,并调用connectToHost()函数来连接到服务器。一旦连接成功,就可以使用QTcpSocket的write()和read()函数来发送和接收数据。 要实现一个UDP服务器,需要创建一个QUdpSocket对象,并绑定到特定的端口上。通过绑定完成后,可以通过readyRead()信号连接一个槽函数,在槽函数中使用readDatagram()函数来接收数据。 要实现一个UDP客户端,只需创建一个QUdpSocket对象,并使用writeDatagram()函数来发送数据。对于接收数据,使用readyRead()信号连接一个槽函数,在槽函数中使用readDatagram()函数来接收数据。 无论是TCP还是UDP服务器和客户端,都需要处理网络连接的建立、断开、异常等情况。使用Qt的信号和槽机制,可以很方便地处理这些情况,并进行相应的操作。 总之,Qt提供了一个易于使用的网络编程框架,可以轻松实现TCPUDP服务器和客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值