首页 > 系统相关 >Windows下udp广播【C++】

Windows下udp广播【C++】

时间:2023-01-20 11:33:58浏览次数:50  
标签:SOCKADDR udp addr Windows 绑定 端口 C++ Winsock sin

  最近学习了下Windows下的Socket使用,在这里记录一下。

 

前置准备

  在使用api前,需要做一些必要的准备。

头文件包含

  

//包括 Winsock 2 头文件使用 Winsock API,包含大多数 Winsock 函数、结构和定义。
#include <winsock2.h>
//Ws2tcpip.h 头文件包含 WinSock 2 Protocol-Specific TCP/IP 的附件文档中引入的定义,其中包含用于检索 IP 地址的较新的函数和结构
#include <ws2tcpip.h>
//确保生成环境链接到 Winsock 库文件Ws2_32.lib。 使用 Winsock 的应用程序必须与 Ws2_32.lib 库文件链接。 #pragma注释指示链接器需要 Ws2_32.lib 文件。
#pragma comment(lib, "Ws2_32.lib")

 

启用套接字

WSADATA data;
//启用windows异步套接字2.2版本
if (WSAStartup(MAKEWORD(2, 2), &data))
{
   //进到这里说明启用失败了
}

创建套接字

SOCKET udpSocket_sender = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//如果得到的套接字无效,可以清除启用的套接字
if (INVALID_SOCKET == udpSocket_sender)
{//下面代码功能是终止Winsock 2 DLL (Ws2_32.dll) 的使用
     WSACleanup();
}

 

 

广播发送端

   广播发送方在做完上面准备后,还需要一步准备:`设置广播权限` 。

//设置广播权限
BOOL bBroadcast = TRUE;
setsockopt(udpSocket_sender, SOL_SOCKET, SO_BROADCAST, (const char*)&bBroadcast, sizeof(bBroadcast));
//设定目标sock地址信息
SOCKADDR_IN addr_dst;
//sin_family指代协议族,在socket编程中只能是AF_INET(即tcp/ip)。 addr_dst.sin_family = AF_INET; addr_dst.sin_port = htons(8080);//htons函数把数据类型转化成我们需要的u_short addr_dst.sin_addr.S_un.S_addr = inet_addr("192.168.1.255");//我这子网掩码是255.255.255.0,所以把最后一段改成255就是广播地址了

  发送消息逻辑:

char buf[7] = { '1','1','4','5','1','4' };
//如果发送成功,sendto会返回发送完成的字节数
if (sendto(udpSocket_sender, buf, 7, 0, (SOCKADDR*)&addr_dst,
               sizeof(addr_dst)) == SOCKET_ERROR)
{
    //发送失败会进这里
}
//sendto会隐式地绑定一个随机端口(发送消息的端口),
//也可以在发送之前显示地进行端口绑定再发送,
//所以之后我们可以不必绑定端口从这个端口接收消息
//不过我这是把广播发送到指定端口(8080),而这里隐式绑定的不一定是8080,所以接收消息在后面显示绑定端口

广播接收端

  接收端在做完前置准备部分工作后,绑定到接收信息的端口前,还需要设定下来源sock的部分信息。

SOCKADDR_IN addr_src;
addr_src.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addr_src.sin_family = AF_INET;
addr_src.sin_port = htons(8080);

  绑定端口

if (bind(udpSocket_receiver, (SOCKADDR*)&addr_src, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
    //绑定失败会到这
}

  最后就是接收消息了

char recvBuf[128] = { 0 };
SOCKADDR_IN addr_cli;
int len = sizeof(addr_cli);
//等待并数据,成功时返回值为接收数据字节数
int rs = recvfrom(udpSocket_receiver, recvBuf, 128, 0, (SOCKADDR*)&addr_cli, &len);

 

标签:SOCKADDR,udp,addr,Windows,绑定,端口,C++,Winsock,sin
From: https://www.cnblogs.com/nefure/p/17062599.html

相关文章

  • C++ 类中定义成员类型名
    C++可以在类中给某个类型定义一个只属于该类的成员类型名,使得可以通过类名::成员类型名来访问该类型这在我使用C#过程中是从来没有遇到过的,最开始遇到的时候真的很懵逼如......
  • C++缺省源
    C++竞赛使用缺省源(初稿)点击查看代码/* Author:Sean_xzx RightOutput!&Accepted!本题核心:1.本题步骤:1.*/#include<bits/stdc++.h>#definefz(i,a,b)fo......
  • 第五十章 使用 ^SystemPerformance 监视性能 - Microsoft Windows 平台的 InterSystem
    第五十章使用^SystemPerformance监视性能-MicrosoftWindows平台的InterSystemsIRIS性能数据报告MicrosoftWindows平台的IRIS性能数据报告%SS-使用ALL......
  • 一个C#将字节流通过管道传输到C++的问题
    提问: 提问一个C#将字节流通过管道传输到C++的问题现有一个字节流数据需要通过管道传输到C++,目前使用的方法是转成string通过WriteLine写入管道中,在C++中通过ReadFile读取......
  • windows
    将软件启动添加至右键快捷方式--powershell#powershell 所在目录为 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe1.windows+r2.键入regedit(打开注......
  • 记一次配置Windows终端terminal
    立即安装Windows终端terminalGit发布页面发布地址https://github.com/microsoft/terminal/releases应用商店安装地址https://aka.ms/terminalwingetwingetinstall......
  • 使用 Datakit 的 C/C++ profiling 功能
    使用Datakit的C/C++profiling功能前置条件Datakit侧配置PyroscopeAgent侧的安装与配置安装PyroscopeAgent获取nginx的PID运行PyroscopeAgent登......
  • C++的Visual Studio编译
    当我在使用C++创建控制台项目的时候我想把创建的一个HelloWorld!基本控制台编译完,发给其他人,让其在其他电脑上运行结果,当其他电脑打开我编译好的exe程序时...就出现了......
  • C++ OpenCV
    准备工作Ubuntu系统(虚拟机和物理机、服务器都可以)OpenCV3.4.1压缩包OpenCVcontrib3.4.1压缩包版本信息GCC版本Ubuntu11.3.0-1ubuntu1~22.04G++版本U......
  • Windows Server上部署IoTdb 集群
    本文是参考官方的IoTDB集群版(1.0.0)的安装及启动教程:https://iotdb.apache.org/zh/UserGuide/V1.0.x/Cluster/Cluster-Setup.html,在WindowsServer2019上部署集群的实践......