windwos平台下C++实现一个基于UDP的C/S模式通信示例

socket编程 -- 基于UDP协议的C/S通信模型及实现 UDP服务端/客户端通信的基本模型由于UDP不需要维护连接,程序逻辑简单了很多。 但是UDP协议是不可靠的,实际上有很 多保证通讯可靠性的机制需要在应用层实现。基于UDP协议的客户端/服务端通信的实现服务端 接收来自客户端的字符串,将小写字母转为大写字符后发送给客户端服务端源码server.c/*server.c*/ #include <stdio.h> #include <stdlib.h> 阅读详情

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议。这个通信协议主要有以下特点:

1.非面向连接通信
2.没有拥塞控制、重传机制
3.报文头8个Byte
4.适用与对数据实时性传输要求高的网络

IP地址+端口号+传输协议可以在网络中唯一的标记一个进程,UDP正是通过这个模式实现网络中客户端与服务端的配对通信。现在在windows环境下编写一个客户端发送数据到服务端的样例。其实无论是java还是C++网络编程,其基本原理都是一样的,甚至都是调用一些系统已经封装好的库函数。在windwos平台中我们将调用WSA(Windows Sockets Asynchronous)
主要用到两个”winsock2.h”中的函数

1.接收数据函数

int recvfrom(int sockfd,void *buf,int len,unsigned int lags,struct sockaddr *from,int *fromlen); 

1.sockfd 定义的socket
2.buf 存储数据的缓冲区
3.len 缓冲区大小
4.lags 一般设置为0
5.from 保存源机的IP地址及端口号。
6.fromlen 当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。
7.Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,

2.发送数据函数

int sendto(int sockfd, const void *msg,int len unsigned int flags, const struct sockaddr *to, int tolen)

1.sockfd 定义的套接字
2.msg 存储要被发送的数据的缓冲区
3. len 缓冲区大小
4.flags 一般设为0
5. to 服务器地址
6. token 我们定义为服务的地址大小

服务端代码

#include<iostream>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main() {
    WSADATA data;                                           //windows异步套接字数据结构体
    WORD w = MAKEWORD(2, 0);                                //指定winsock 版本的为 2.0
    WSAStartup(w, &data);                                   //指定程序可以使用winsock 2.0版本的套接字
    SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);               //初始化套接字
    sockaddr_in addr,addr2;                                  //声明服务器地址和客户端地址
    int token = sizeof(addr2);                                //以客户端地址的sizew为token
    char buff[60] = { 0 };                  //接收数据缓冲区

    addr.sin_family = AF_INET;          //使用IPv4协议簇
    addr.sin_port = htons(71);       //向71号端口发送数据

    addr.sin_addr.S_un.S_addr = inet_addr("192.168.15.72");   //服务器本身地址
    bind(s, (sockaddr*)&addr, sizeof(addr)); //将套接字和服务器地址绑定在一起
    bool first = true;        //第一次连接标记

    cout << "服务器已经启动" << endl;
    while (true) 
    {
        if (recvfrom(s, buff, 60, 0, (sockaddr*)&addr2, &token) > 0) //从客户端接受数据
        {
            if (first)
            {
                cout<<"已经与客户端地址链接上: "<<inet_ntoa(addr2.sin_addr)<<endl;
                first = false;
            }
            cout << buff << endl;//输出客户端内容
        }
    }

    closesocket(s);  //关闭套接字
    WSACleanup();  //终止Ws2_32.dll的使用
}

WSADATA data; //这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。

客户端代码

#include<iostream>
#include <winsock2.h> 
#pragma comment(lib,"WS2_32.lib") 
#include <windows.h>
#include<string>
using namespace std;
void UDPSendData(char* dataToSend,int len,string address)
    {
        WSADATA data;
        WORD version = MAKEWORD(2, 0);               //指定winsock 2.0套接字版本
        WSAStartup(version, &data);                  //指定程序可以使用winsock 2.0版本的套接字
        SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);   //初始化套接字
        const char *char_address = address.c_str();  //将传入的服务器地址从"string"转到"char *"
        sockaddr_in server_addr;                           //声明服务器地址
        int token = sizeof(server_addr);                   // 以sockeadr_in 的大小作为token  
        server_addr.sin_family = AF_INET;                 //使用IPv4协议簇
        server_addr.sin_port = htons(71);                 //向71号端口发送数据
        server_addr.sin_addr.S_un.S_addr = inet_addr(char_address);//发送到服务器的地址

        sendto(s, dataToSend,len, 0, (sockaddr*)&server_addr, token);       //发送数据到服务器          

        closesocket(s);                                        //关闭套接字
        WSACleanup();                                          //终止Ws2_32.dll的使用
    } 
int main() {
    char *test = (char*)"Be the change you want to see in the world.";
    string address = "192.168.15.72"; 
    int len = strlen(test);
    UDPSendData(test,len,address);
    system("pause");
    return 0;
}  

运行验证

服务端

这里写图片描述

客户端

这里写图片描述
任何问题欢迎留言:)

C++ Windows非阻塞UDP通信源码 UDP通信中,recvfrom或recv等函数默认都是阻塞方式进行的,即如果没有收到消息,那么程序会一直卡在recv()这个函数这里,使得该线程不能进行后续的操作。但有时候我们需要该线程在有UDP数据发送过来的时候才进行数据接收,而在其他时间该线程还有别的任务进行处理,那么我们就需要将Sokcet设置为非阻塞通信的方式。非阻塞通信中,需要用到select()函数,select函数用于在非阻塞中,当一 阅读详情

相关推荐

C++ UDP广播 demo 实例

VC++6.0 UDP demo 实例 简单的udp广播实例

Windows C++ 编程:UDP组播

组播报文的目的地址需使用D类IP地址,范围从 224.0.0.0到239.255.255.255。本文将分享在Windows环境下使用C++编写的UDP组播示例,不同的操作系统环境使用的头文件及函数略有不同。

小平爱吃肉的博客 5335

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 683

C++ windows TCP和UDP通信学习

服务端,相比较于TCP ,UDP客户端无需 connect ,服务端也无需accept ,socket套接字初始化,TCP的是 SOCK_STREAM 而UDP的是 SOCK_DGRAM,UDP接收和发送用的是recvfrom 和 sendto , TCP用的是recv和send。本章主要总结 C++ windows 下tcp和 udp通信的一些要点。可参考两张简单的通信流程图。(1)tcp的通信过程。(2)UDP的通信过程。

AP1005834的博客 1263

YonBIP 3.0 报表开发+报表超链接

用友报表开发

m0_55096250的博客 1757

jason-2卫星介绍及其数据下载

两台仪器发射脉冲宽度均为105.6μs,带宽320MHz(C频段)和320/100MHz(Ku频段),脉冲重复频率1800Hz(Ku频段)和300Hz(C频段),功率78W,数据传输速率22.5kbit/s。共发射了3颗卫星(Jason - 1/2/3),星上有效载荷均主要为雷达高度计和微波辐射计。Jason - 1卫星主要有效载荷为波塞冬 - 2和“贾森微波辐射计”,Jason - 2卫星进行了改进,主要携带了波塞冬 - 3和先进微波辐射计,此外,Jason - 2卫星还携带了“多里斯”系统。

beautyaaaa的博客 1605

Windows API 函数

《Windows API函数手册》摘要 本文档是Windows平台开发的权威参考手册,全面收录774个核心API函数,涵盖系统管理、进程线程、窗口消息、文件操作、图形处理等12大功能模块。手册采用结构化编排,主要特点包括: 编码规范 详细区分多字节(char)与宽字符(wchar_t)编码体系 提供LPSTR/LPCWSTR等字符串指针类型的完整解析 说明UTF-8与GBK编码转换的实际应用场景 核心功能模块 窗口创建:完整展示从注册类到消息循环的窗口生命周期 文件操作:覆盖CreateFile/ReadF

gqk01的博客 862

国产安全芯片在密码算法国密体系下的性能适配策略

国密体系即国家商用密码体系,是保障信息安全的核心技术体系。自20世纪90年代末起步,国密体系经历了从无到有、从弱到强的发展历程。1999年,国家密码管理局成立,标志着国密体系的正式建立。2000年,国密SM1算法首次发布,开启了国密算法的标准化进程。此后,SM2、SM3、SM4等算法陆续推出,形成了完整的对称与非对称密码算法体系。:2010年,国密标准正式纳入国家标准体系,国密算法在金融、政务、通信等关键领域的应用得到明确规范。

qq_40552871的博客 1355

Windows下的UDP客户端的C++实现

Windows下的UDP客户端C++实现,跟前面的TCP UDP很像,前面的文章有详细解析 #pragma comment(lib, "Ws2_32.lib") #include <iostream> #include <Winsock2.h> #include <Ws2tcpip.h> using namespace std; /* UDP Client */ int main(void) { //1.加载套接字库 WORD wVersionReq

QQ845264718 1597

Fiori Elements 从入门到精通开发教程的文章目录

Fiori Elements 开发技术相对 SAP 其他历史悠久,发展成熟的开发技术来说,是一个新事物。正因如此,迄今为止国内深入讲解 Fiori Elements 应用的中文材料几乎没有。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4728

实战交易策略 篇二十二:情绪流龙头交易策略

在股票市场中,机构主导趋势,游资驱动热点,散户易被情绪裹挟,形成“金字塔”式生态链,并存在情绪传递、强者恒强、物极必反的规律特点。股市是资金驱动的情绪博弈场,价格波动由群体心理、资金博弈和预期差共同驱动,核心是资本逐利性与人性贪婪恐惧的交织,兼具资源配置、财富再分配与风险定价功能。涨停加速与逃逸缺口(主升强化)凹字板/平台突破(趋势延续)天量弱转强(分歧买点)不参与首波(二波策略)情绪周期(道术合一)主线思维(聚焦核心)开盘抢筹(竞价博弈)一字助攻(情绪强化)分批进出(滚动操作)

生活在别处 1487

C/C++ Windows API——Udp

// UdpDemo.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Winsock2.h> #include <WS2tcpip.h>//inet_ntop, inet_pton#pragma comment(lib, "WS2_32.lib") #define B

司马懿的西山居 2972

MEMS传感器技术深度解析:从原理到未来趋势的全面指南(智能驾驶赛道有戏)

在智能汽车每秒产生1GB数据的今天,在可穿戴设备厚度突破1毫米的极限挑战下,MEMS(微机电系统)传感器正以的三大核心优势,重塑着人类感知世界的方式。作为从业10年的MEMS工程师,我见证了这个领域从实验室走向量产的完整历程——从2005年汽车安全气囊中笨重的压阻式加速度计,到2025年智能手机中集成5种传感器的SoC芯片,MEMS技术正在书写传感器行业的摩尔定律新篇章。本文将带您穿透技术迷雾,深入解析MEMS传感器的技术密码,涵盖,并附独家整理的与。文末更提供,助您把握万亿级市场机遇。

优快云-新能源汽车研发测试专业博主 2297

C++中UDP通讯详解

C++

u011555996的博客 1万+

【图像超分】论文复现:CVPR 2024 | 轻量化超分 | 窗口注意力改进 | CAMixerSR的Pytorch源码复现,跑通源码,获得指标和超分结果,计算复杂度,架构梳理拆解,逐行注释!

本文介绍了超分辨率重建方法CAMixerSR的代码实现与运行指南。文章亮点包括:完整跑通源码获取PSNR/SSIM指标和可视化结果;详细解析模型架构与关键代码注释,帮助快速复现基线模型。实验部分提供了测试配置文件和训练设置说明,支持2K/4K/8K大图像超分和x2/x4轻量化超分。环境依赖PyTorch和BasicSR框架,数据集包含DIV2K等常用基准。测试结果与论文指标一致,可视化输出保存至指定目录。训练配置可自定义数据集路径、GPU数量等参数。该实现突出了CAMixerSR在降低W-MSA复杂度方面的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 438

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机网络 | 基于UDP的C/S模型代码实现

基于UDP的C/S模型代码实现,组播代码实现。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 2549

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

win操作系统C++语言 socket,udp通信

win平台C++语言 socket,udp通信 服务端流程 首先要加载套接字库 创建套接字 服务端地址 bind 套接字与地址绑定 recvfrom 等待并接收数据 sendto 发送数据 资源关闭 服务端代码示例 // udpsrv.cpp #include<stdio.h> #include <iostream> #include <WinSock2.h> #include<WS2tcpip.h> #pragma comment(lib,"ws2_3

总结和收藏 2676

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Windows下C语言多线程实现UDP通信程序recvfrom()函数出现10054错误:远程主机强迫关闭了一个现有的连接

Windows下C语言多线程实现UDP通信程序recvfrom()函数出现10054错误:远程主机强迫关闭了一个现有的连接。 问题:将recvfrom函数置于一路线程中,sendto函数置于主线程中,当单独运行下面程序时recvfrom()函数出现10054错误。

SDTyuan的博客 1559

【Windows】【C++】【Udp】 udp通信协议详解和示例

在 Windows 平台上,使用 C++ 实现的 UDP 通信服务器和客户端示例代码稍有不同,因为 Windows 使用 Winsock API 进行网络编程。下面是一个简单的 UDP 服务器和客户端的实现示例,包括详细的代码和说明。

qq_37377257的博客 1541

Socket通信讲解及C/S结构实现UDP协议通信

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制,是支持TCP/IP协议的路通信的基本操作单元。

weixin_45266856的博客 3727

基于UDP协议的网络通信----C/S

UPD协议是:无连接,不可靠的数据报传输,对不稳定的网络层采取完全不弥补的策略 它是直接向指定ip和端口的进程发送数据,并且不管对方是否收到。 所以它不稳定,但是速度快,时效性高 UDP比TCP网络通信模型的代码更简单,我们直接看代码就懂了。 server.c #include<stdio.h> #include<sys/types.h> #include<sys/s...

城南花已开的博客 525

创建Udp发送端(c++ in Windows)

由于项目中偶尔会要求用c++实现小功能例如数据传输数据存储,因此在此记录一种简单的用法。 (此文章重点在于使用,不在于全面。) 代码如下: #include <iostream> #include <WinSock2.h> #include <stdio.h> #include <stdlib.h> using namespace std; #pragma comment(lib,"WS2_32.lib") void createUdpSend() { /

weixin_42282363的博客 670

Windows C++ 网络编程Udp

服务器 #include <winsock2.h> #include<iostream> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); if (WSAStartup(sockVersion, &wsaData) != 0) {

GreedySnaker的博客 583

Win环境下C++和Python的UDP通信

使用UDP传输链接C++和python,实现pygame实时作图

weixin_44372396的博客 1217

C++设计UDP协议通讯示例

UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高  一、绪言  UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高。所以在网络上仍有很大的用途。这几日需要了解下udp通讯的过程,上网发现这方面的资料还挺少。于是仔细的翻找了下msdn,基本上搞清楚了udp通讯的过程。做了一个测试的例子。希望对大家有帮助。  二、UDP

houghstc的专栏 1899

C++之UDP通信例程

C++ udp通信的例子

techenliu的博客 1119
上一篇: windows 平台g++、gcc、gdb编译环境搭建及使用示范【详细步骤】
下一篇: C++ map基本操作实例
原来是阿亮
博客等级 码龄11年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值