当前位置: 首页 > news >正文

boost库在工作(37)网络UDP服务端之七

前面介绍的都是网络TCP的服务器和客户端,其实还有UDP的服务器和客户端,同时也有同步和异步之分。UDP与TCP最大的区别,就是TCP是基于连接的,而UDP是无连接的。这里所谓的连接是指对方中断服务时,另外一方是可以感知的,而UDP是无法感知对方是否中断服务。还有另外一点,TCP发送的数据包是有流量控制和顺序控制的,而UDP是无流量控制和顺序控制的。因而采用UDP时,基本上都是发送一些无关顺序,或者丢失的情况下使用。比如UDP使用在即时语音通讯、视频通讯上,就存在广泛的使用。由于语音通讯时,对于已经丢失的话,可以再说,并且过时的语音再播放出来也是无意义的。还有在视频会议上,由于不同的客户存在不同的带宽和处理速度,因此,对于不同的客户在视频上同步,也是通过慢速的客户进行丢掉数据处理的,否则慢速的客户会越来越多视频数据堆积,从而看不到新的视频。下面就来使用boost库来实现一个UDP服务器,并且它是基于同步的服务器。代码如下:

// boost_026.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <ctime>

#include <boost/asio/ip/tcp.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/array.hpp>

#include <iostream>
#include <string>

//把当前时间转换为字符串。
std::string make_daytime_string()
{
	using namespace std; // For time_t, time and ctime;
	time_t now = time(0);
	return ctime(&now);
}
//
//创建一个UDP的时间服务器。
//软件开发人员: 蔡军生  2013-08-11 
//QQ: 9073204
//
void TestUdp(void)
{
	//定义一个IO服务。
	boost::asio::io_service io_service;
	//创建UDP的SOCKET,协议为V4版本,端口为13.
	boost::asio::ip::udp::socket socket(io_service, 
		boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 13));

	//循环处理所有客户端发送过来的命令。
	for (;;)
	{
		boost::array<char, 1> recv_buf;
		boost::asio::ip::udp::endpoint remote_endpoint;
		boost::system::error_code error;
		//接收客户端数据。
		socket.receive_from(boost::asio::buffer(recv_buf),
			remote_endpoint, 0, error);

		//如果出错,就抛出异常。
		if (error && error != boost::asio::error::message_size)
		{
			throw boost::system::system_error(error);
		}

		//获取当前时间字符串.
		std::string message = make_daytime_string();

		boost::system::error_code ignored_error;
		//把时间字符串发送给客户端。
		socket.send_to(boost::asio::buffer(message),
			remote_endpoint, 0, ignored_error);
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	//
	TestUdp();

	return 0;
}

 

 

 

转载于:https://www.cnblogs.com/pangblog/p/3253768.html

相关文章:

  • H面试程序(0):字符串一些常用函数的实现
  • 不容易系列之(4)——考新郎[HDU2049]
  • 正则表达式介绍
  • hdu 1029
  • SQL server经验分享:SQLSERVER 被标记为“可疑”的数据库处理方法
  • 代码自动生成工具MyGeneration之一(程序员必备工具)
  • ASP.NET中利用Split实现对Checkbox的字符串分离放到DataTable里面
  • Git基本操作(add,commit的理解)
  • 怎么编写测试驱动程序
  • 百度地图 - 合并模拟器和真机的静态库文件
  • vb常用命名空间
  • Java解析xml配置文件合成器
  • HTTP 状态代码及其定义
  • VS2008快捷键大全
  • 新浪微博API
  • Median of Two Sorted Arrays
  • mysql常用命令汇总
  • nginx 配置多 域名 + 多 https
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue 个人积累(使用工具,组件)
  • Vue官网教程学习过程中值得记录的一些事情
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 订阅Forge Viewer所有的事件
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 模型微调
  • 三分钟教你同步 Visual Studio Code 设置
  • 实习面试笔记
  • 使用 Docker 部署 Spring Boot项目
  • 用Visual Studio开发以太坊智能合约
  • 带你开发类似Pokemon Go的AR游戏
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​香农与信息论三大定律
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • ()、[]、{}、(())、[[]]命令替换
  • (12)Linux 常见的三种进程状态
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (一)appium-desktop定位元素原理
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .Net 4.0并行库实用性演练
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net 简单实现MD5
  • .NET 中的轻量级线程安全
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net下简单快捷的数值高低位切换
  • @Autowired @Resource @Qualifier的区别
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [ABC294Ex] K-Coloring
  • [autojs]逍遥模拟器和vscode对接
  • [CISCN2019 华东北赛区]Web2
  • [Codeforces1137D]Cooperative Game
  • [Geek Challenge 2023] web题解