[MFC]UDP通信的简单实现

UDP通信在MFC中的简单实现
本文介绍了UDP与TCP的区别,强调了UDP在速度上的优势及其在即时通讯中的应用。接着讲解了UDP套接字编程的特点,如客户端无需connect,服务器端无需listen和accept,双方使用sendto和recvfrom进行通信。最后提到了sendto和recvfrom函数的使用,并预告了一个简单的UDP通信实例。

1. UDP和TCP最大的区别:

     1) TCP最大的特点就是面向连接、安全可靠,也就是说TCP通信必须要先建立连接,并且通信过程需要时时校验,如果数据有误需要重发;

     2) UDP最大的特点就是面向无连接,不可靠,也就是说不用建立连接就直接向目标发送信息,并且通信过程中不做任何校验,如果数据丢失或者有误也不管;

     3) 听上去UDP非常的无用,但其实不然,UDP最大的优势就是速度快,而TCP在连接和校验的过程中会消耗非常多的时间,因此TCP一般用于对数据要求精确无误的场合下,比如下载程序(迅雷等),可想而知,若你下载一个软件,中间传输的数据有误那软件岂不是用不了了吗?

     4) UDP的应用场合通常是即时通讯等要求速度高于质量的场合,比如视频对话、网络对话等,在这种场合下,特别是在视频聊天时,视频质量可以不那么清晰(UDP不对数据校验),但是画面必须是时时的,如果用TCP的话可能视频声音是当前的声音,但是画面可能还是是几秒前的画面,这就不符合即时的要求了!!因此UDP的应用场合还是非常多的!


2. UDP的Sockets编程:

    1) 首先最大的特点就是客户端不需要使用connect连接,服务器端也不需要listen来监听请求,但不过建立套接字的过程还是和TCP一样的;

    2) 服务器端不需要accept了,因为不需要监听,而是直接可以用recvfrom函数接受客户端发送的数据!

    3) 而客户端由于不需要connect连接服务器端,因此可以直接使用sendto函数向目标服务器发送数据;

    4) 双方都可以直接使用sendto和recvfrom进行数据通信;

    5) UDP套接字的配置:

         i. 首先需要在socket

### C++ 实现跳动的粒子爱心动画 以下是基于用户需求设计的个完整的动态粒子爱心程序代码。该代码通过控制台输出实现了个不断变化大小的心形图案,并模拟了心跳的效果。 #### 主要思路 利用参数化方程绘制心形曲线,调整时间间隔来实现动态效果。具体来说,使用极坐标系下的心形方程 `r(θ)` 来计算点的位置并打印到屏幕上[^1]。为了增加复杂性和真实感,可以加入随机噪声或粒子运动轨迹[^2]。 ```cpp #include <iostream> #include <cmath> #include <thread> #include <vector> using namespace std; // 定义屏幕尺寸和比例因子 const int WIDTH = 80; const int HEIGHT = 25; const double SCALE_FACTOR = 2.0; void clearScreen() { cout << "\033[2J\033[1;1H"; // ANSI 清屏命令 } pair<double, double> heart(double t, double scale) { const double a = 1.0 * scale; // 控制整体大小的比例系数 double r = pow(sin(t), 3); // 极径部分 double x = a * 16 * sin(t)*sin(t)*cos(t); double y = -a * (13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)); return make_pair(x / SCALE_FACTOR, y / SCALE_FACTOR); } int main() { vector<pair<int, int>> points; bool running = true; while(running){ clearScreen(); // 计算当前帧的所有像素位置 points.clear(); for(int i=0;i<720;i++){ pair<double,double> p = heart(i*M_PI/360.0, 1 + abs(cos(M_PI*clock()/CLOCKS_PER_SEC))); // 动态缩放 int px = round(WIDTH/2 + p.first); int py = round(HEIGHT/2 - p.second); if(px >=0 && px <WIDTH && py>=0 && py<HEIGHT ){ points.emplace_back(px,py); } } // 绘制图像 for(int j=0;j<HEIGHT;j++) { for(int k=0;k<WIDTH;k++) { char c=' '; for(auto &[px,py]:points){ if(j==py && k==px){ c='❤'; break; }else{ // 添加些随机粒子作为装饰 static auto seed = chrono::steady_clock::now().time_since_epoch().count(); default_random_engine generator(seed+j+k+i); uniform_real_distribution<float> distribution(-SCALE_FACTOR,+SCALE_FACTOR); float noiseX=distribution(generator)/2; float noiseY=distribution(generator)/2; if(abs(k-(px+noiseX))<=1 && abs(j-(py+noiseY))<=1){ c='.'; break; } } } cout<<c; } cout<<"\n"; } this_thread::sleep_for(chrono::milliseconds(100)); // 延迟让画面流畅过渡 } } ``` 此代码片段定义了种方法用于生成随时间波动的心型图形,并且加入了少量随机扰动以模仿粒子漂浮现象[^1]^[]^。注意这里采用了ANSI转义序列清除终端内容以便连续更新显示区域[^2].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值