首页 > 编程语言 >C/C++ Socket UDP 广播消息的发送与接收

C/C++ Socket UDP 广播消息的发送与接收

时间:2023-02-01 21:32:49浏览次数:33  
标签:__ UDP Socket ret fd C++ message sizeof addr


C/C++ Socket UDP 广播消息的发送与接收


局域网内全网段广播消息的IP地址为:255.255.255.255,向该IP地址发送广播消息,局域网下的任何网段的客户机都能收到广播。

对于发送端,如果你只想给某个特定的网段发送消息,例如你的IP地址为192.168.31.107,那么你的广播地址是192.168.31.255,向该广播地址发送广播消息,只有192.168.31.XXX网段下的客户机能收到广播。

同样,对于接收端,绑定了广播地址0.0.0.0这个IP即可。

C语言 UDP 广播简单示例(linux系统下):

/*
* main.c
*
* Created on: Sep 26, 2022
* Author: root
*/

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define BOARDCAST_IP "255.255.255.255"
#define BOARDCAST_PORT 10130

int broadcast_send(void)
{
int fd;
int ret;
int on;
struct sockaddr_in addr;
const char* message = "This is boardcast message !";

fd = socket(AF_INET, SOCK_DGRAM, 0);

if(fd < 0)
{
fprintf(stderr, " create socket failed ! \n");
goto __exit;
}

on = 1;
ret = setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
if(ret < 0)
{
fprintf(stderr, " setsockopt failed ! \n");
goto __exit;
}

memset(&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;
addr.sin_port = htons(BOARDCAST_PORT);
addr.sin_addr.s_addr = inet_addr(BOARDCAST_IP);

ret = sendto(fd, message, strlen(message), 0, (struct sockaddr *)&addr, sizeof(addr));
if(fd < 0)
{
fprintf(stderr, " boardcast failed ! \n");
goto __exit;
}

printf(" send ok ! \n");

__exit:
close(fd);
return 0;
}

int broadcast_recv(void)
{
int fd;
int ret;
int on;
struct sockaddr_in addr, addr_from;
char message[512];
socklen_t len;

fd = socket(AF_INET, SOCK_DGRAM, 0);

if(fd < 0)
{
fprintf(stderr, " create socket failed ! \n");
goto __exit;
}

on = 1;
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if(ret < 0)
{
fprintf(stderr, " setsockopt failed ! \n");
goto __exit;
}

memset(&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;
addr.sin_port = htons(BOARDCAST_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
if(ret < 0)
{
fprintf(stderr, " bind failed ! \n");
goto __exit;
}

memset(message, 0X00, sizeof(message));

len = sizeof(addr_from);
ret = recvfrom(fd, message, sizeof(message), 0, (struct sockaddr *)&addr_from, &len);
if(ret < 0)
{
fprintf(stderr, " recv failed ! \n");
goto __exit;
}

printf(" recv: [%s] ok ! \n", message);

__exit:
close(fd);
return 0;
}

int main(int argc, const char* argv[])
{
if(argc == 2)
{
if(strcmp(argv[1], "recv") == 0)
{
broadcast_recv();
}

if(strcmp(argv[1], "send") == 0)
{
broadcast_send();
}
}else
{
printf("\r\n");
printf("########################################### \r\n");
printf("Usage: %s [ recv | send ] \r\n", argv[0]);
printf("e.g. : %s recv\r\n", argv[0]);
printf("e.g. : %s send\r\n", argv[0]);
printf("########################################### \r\n");
}

return 0;
}

程序运行结果:

C/C++ Socket UDP 广播消息的发送与接收_广播


ends…


标签:__,UDP,Socket,ret,fd,C++,message,sizeof,addr
From: https://blog.51cto.com/u_15950551/6031875

相关文章

  • 利用natapp实现TCP、UDP内网穿透
    利用natapp实现TCP、UDP内网穿透natapp官网:​​https://natapp.cn/​​下载:下载下来其实就只有一个文件:首先在natapp官网上注册一个账号,并实名认证,这一步是必须的!然后去购买......
  • C++ Day11 使用单例模式封装log4cpp
    一、实现log4cpp的封装,使其可以像printf一样使用,测试用例如下: 思路:使用可变模板参数,最终达到的效果是在使用 LogInfo、LogError、LogWarn、LogDebug时候可以传递任意类......
  • 闲散随笔的C++教程(一)——绪
    绪在猴子的世界中,编程语言是很多的。你不一定非要选择C++——没错,这并不是一门非常好学的语言。所以当你看到这个开头时就后悔,还是来得及的。但是看样子你是不准备后悔,或......
  • 递归先序输入构造一颗二叉树并输出并求从根结点出发的最大带权和 (c++)
    #include<iostream>#include<cstdio>usingnamespacestd;typedefstructBiTNode//一颗二叉树的结构体{intdata;structBiTNode*lchild,*rchiild;}BiTNode,......
  • C语言&C++
    C语言和C++中都有结构的概念,但是在C语言中结构只有成员变量,而没成员方法,而在C++中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,不管什么人想......
  • C++ 信奥赛 1077:统计满足条件的4位数
    1077:统计满足条件的4位数【题目描述】给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字,再减去十位数上的数字......
  • springboot+webSocket
    1、新建WebSocketConfig配置类packagecom.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configurat......
  • Net6/SuperSocket通过命令和命令过滤器实现服务端/客户端双工通信
    十年河东,十年河西,莫欺少年穷学无止境,精益求精和上一节一致,通信数据结构如下:///+-------+---+-------------------------------+///|request|l|......
  • python tcp socket 源码分享
    服务端的源码:importsocketserverclassHandler_TCPServer(socketserver.BaseRequestHandler):"""TheTCPServerclassfordemonstration.Note:We......
  • C++ malloc下申请内存途径
    之前就因为glibc的free不一定会将内存归还OS,导致OOM,造成了上千万损失,当时心态差点崩了五年前的时候,因为OOM导致进程无故被kill掉,也没有coredump,分析了好久,最后发现是因为......