设计模型

服务器和客户端启动没有顺序之分(因为不需要三次握手,这也是与TCP的区别)

客户端启动就直接发数据

服务端启动就直接接数据

UDP基本函数使用简化图

代码如下:

LocalUDPServer.cpp

#include <tchar.h> // _T宏
#include <stdio.h>// printf sprintf#include <iostream>// cout fstream
using namespace std;// windows socket
#include <winsock.h>
#pragma comment (lib,"ws2_32.lib")bool initSocketLib();void main()
{if(!initSocketLib())return;// 初始化本地客户端套接字SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(serSocket == INVALID_SOCKET){printf("socket error !");return ;}sockaddr_in serAddr;serAddr.sin_family = AF_INET;serAddr.sin_port = htons(514);serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1")/*INADDR_ANY*/;if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){printf("bind error !");closesocket(serSocket);return ;}sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr); while (true){char recvData[255];  int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);if (ret > 0){recvData[ret] = 0x00;printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));printf(recvData);}//char * sendData = "一个来自服务端的UDP数据包\n";//sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);}closesocket(serSocket); WSACleanup();return;
}bool initSocketLib()
{WSADATA Data;//初始化windows Socket Dllint status = WSAStartup(MAKEWORD(1,1),&Data);if (0!=status){printf(_T("初始化失败\n"));return false;}return true;
}

RemoteUDPServer.cpp

#include <tchar.h> // _T宏
#include <stdio.h>// printf sprintf#include <iostream>// cout fstream
using namespace std;// windows socket
#include <winsock.h>
#pragma comment (lib,"ws2_32.lib")bool initSocketLib();void main()
{if(!initSocketLib())return;// 初始化本地客户端套接字SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(serSocket == INVALID_SOCKET){printf("socket error !");return ;}// "本地"的服务端地址映射(IP:port)sockaddr_in serAddr;serAddr.sin_family = AF_INET;serAddr.sin_port = htons(514);serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.53");// 因为这是远程机器,客户端也不在本机上,所以绑定实际的物理地址if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){printf("bind error !");closesocket(serSocket);return ;}sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr); while (true){char recvData[255];  int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);if (ret > 0){recvData[ret] = 0x00;printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));printf(recvData);            }//char * sendData = "一个来自服务端的UDP数据包\n";//sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);    }closesocket(serSocket); WSACleanup();return ;}bool initSocketLib()
{WSADATA Data;//初始化windows Socket Dllint status = WSAStartup(MAKEWORD(1,1),&Data);if (0!=status){printf(_T("初始化失败\n"));return false;}return true;
}

LocalUDPClient.cpp

#include <tchar.h> // _T宏
#include <stdio.h>// printf sprintf#include <iostream>// cout fstream
using namespace std;// windows socket
#include <winsock.h>
#pragma comment (lib,"ws2_32.lib")bool initSocketLib();void main()
{if(!initSocketLib())return;// 初始化本地客户端套接字SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(sclient == INVALID_SOCKET){printf("socket error !");return;}// 本地的服务端地址映射(IP:port)sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(514);sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int len = sizeof(sin);// 远程的服务端地址映射(IP:port)sockaddr_in sinEx;sinEx.sin_family = AF_INET;sinEx.sin_port = htons(514);sinEx.sin_addr.S_un.S_addr = inet_addr("192.168.0.53");int lenEx = sizeof(sinEx);char sendData[512];UINT iCount = 0;while (true){memset(sendData,0,512);sprintf(sendData,"client Send %3d\n",iCount++);int senRet = sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);if(senRet == SOCKET_ERROR ){printf("send is error");}senRet = sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sinEx, lenEx);if(senRet == SOCKET_ERROR ){printf("send is error");}printf(sendData);/* 这段注释的代码可以加上,为了理解UDP编程没必要char recvData[255];int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);if(ret > 0){recvData[ret] = 0x00;printf(recvData);}*/Sleep(1000);// 发的太快也没啥意思}closesocket(sclient);WSACleanup();return;
}bool initSocketLib()
{WSADATA Data;//初始化windows Socket Dllint status = WSAStartup(MAKEWORD(1,1),&Data);if (0!=status){printf(_T("初始化失败\n"));return false;}return true;
}

UDP --01--基本开发设计相关推荐

  1. 共享充电宝PCBA方案开发设计

    共享充电宝PCBA是指企业提供的充电租赁设备,用户只需扫描设备屏幕上的二维码,凭借芝麻信用分600分以上即可"免押金"借用一个充电宝,信用分不足600亦可支付100元押金,充电宝成 ...

  2. SQL Server 进阶 01 数据库的设计

    SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...

  3. Unity UGUI开发设计及案例讲解

    Unity--UGUI开发设计及案例讲解 1. Unity4.6跟以前的版本的最大区别首先在于在层级视图中点鼠标右键时出现的弹出菜单上,它把以前许多的菜单项进行了归类,比如cube sphere ca ...

  4. ISTQB AL-TA/TTA连载系列01:软件测试设计面临的挑战

    ISTQB AL-TA/TTA连载系列01:软件测试设计面临的挑战 [概述] 软件测试设计是整个软件测试过程中非常重要的测试活动,其输出的工作产品将直接影响测试发现缺陷的效率和有效性(不管是文档化输出 ...

  5. ASIC开发设计流程

    ASIC开发设计流程 1. 使用语言:VHDL/verilog HDL 2. 各阶段典型软件介绍: a) 输入工具: Summit Summit 公司 b) 仿真工具: VCS, VSS Synops ...

  6. [短彩信]C#短彩信模块开发设计(1)——架构

    准备从以下几个方面简单的谈谈短彩信模块的实现: [短彩信]C#短彩信模块开发设计(1)--架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07 ...

  7. 服务器开发设计之算法宝典

    作者:lynhlzou,腾讯 IEG 后台开发工程师 孙子云:"上兵伐谋,其次伐交,其次伐兵,其下攻城",最上乘行军打仗的方式是运用谋略,下乘的方式才是与敌人进行惨烈的厮杀.同样的 ...

  8. 2012年度最新免费web开发设计资源荟萃

    为什么80%的码农都做不了架构师?>>>    日期:2012-9-11  来源:GBin1.com 免费的设计和开发资源大家肯定都喜欢,在这篇文章中我们收集了7月到8月的最新免费开 ...

  9. [短彩信]C#短彩信模块开发设计(2)——配置

    准备从以下几个方面简单的谈谈短彩信模块的实现: [短彩信]C#短彩信模块开发设计(1)--架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07 ...

最新文章

  1. 资源 | 这是你要的Keras官方中文版(附文档链接)
  2. 系列篇|编写一个翻转事件极性的package
  3. STM32中IO口的8中工作模式
  4. python xgboost参数_如何对XGBoost模型进行参数调优
  5. 《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
  6. 【快乐水题】677. 键值映射
  7. 操作系统核心原理-5.内存管理(中):分页内存管理
  8. VR與AI的激情相遇
  9. Git 提示fatal: remote origin already exists 错误解决办法
  10. Windows 8 Release Preview 安装秘技两则
  11. php oracle 源码_PHP3中使用ORACLE函数的使用说明
  12. 官方确认:新增一所“双一流”大学
  13. 解决Win10中WerFault错误报告问题
  14. FFT(快速傅里叶变换):UVAoj 12298 - Super Poker II
  15. std::deque的使用
  16. Android 文件下载三种基本方式
  17. 窗户控制app开发day1(机智云的二次开发之换皮肤)
  18. html 下拉怎么固定表头,HTML Table 固定表头简单实现
  19. 计算机能破坏光盘中的系统吗,Windows 10中的“光盘映像文件已损坏”怎么办?...
  20. CSS 实现切角效果

热门文章

  1. linux安装opencv让输入密码,linux下安装opencv的全过程(对初学者或者linux不熟悉的童鞋,非常适合)...
  2. js 递归查询所有的叶子结点_浅谈mysql的查询过程
  3. Windows7下VS2013+WDK8.1开发WDF驱动程序全过程
  4. QT4.7和VS2008 顺利安装必读 (最新版)
  5. 详解go语言的array和slice 【一】
  6. SGU 325 Palindrome(贪心)
  7. mysql慢查询分析工具和分析方法
  8. 二、Android应用的界面编程(六)ProgressBar及其子类[SeekBar、RatingBar]er
  9. Telerik RadGridView 右键菜单如何设置?
  10. install lsa package for R on ubuntu 10.04 lts lucid