UDP组播通信(解决端口复用的问题)

2024-06-12 23:18

本文主要是介绍UDP组播通信(解决端口复用的问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在写一个组播通信的功能,结果发现接受同一台电脑上只能运行一个接收端,如果运行两个时,第二个运行的程序不能收到数据。查找原因是因为没有设置端口数据复用的功能(setsockpot),setsockpot的调用见代码。

//发送端
// Send.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<WinSock2.h>
#include <iostream>
#include <Ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")using namespace std;int main()
{WSADATA wsaData = { 0 };WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN sa;sa.sin_family = AF_INET;sa.sin_addr.S_un.S_addr = inet_addr("239.255.88.8");sa.sin_port = htons(6868);int count = 0;char serr[1024] = { 0 };int a = 0;while (1){sprintf_s(serr, "Setsock falied !   %d", count);a = sendto(sock, serr, sizeof(serr), 0, (sockaddr*)&sa, sizeof(sa));if (a > 0){count++;//cout << "send hello lvzai sucessful   " << count << endl;cout << serr << endl;}Sleep(20);}return 0;
}

//接收端

// Recv.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<WinSock2.h>
#include <iostream>
#include <Ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")using namespace std;int main()
{WSADATA wsaData = { 0 };WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addr_rec;addr_rec.sin_family = AF_INET;addr_rec.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  addr_rec.sin_port = htons(6868);bool bOptval = true;int iret = 0;iret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptval, sizeof(bOptval));if (iret != 0)cout << "setsockopt fail: " << WSAGetLastError() << endl;iret = bind(sock, (SOCKADDR*)&addr_rec, sizeof(addr_rec));if (iret != 0){char serr[1024] = { 0 };sprintf_s(serr, "kbind falied !   %d", WSAGetLastError());cout << "bind fail" << endl;return -1;}struct ip_mreq mreq;mreq.imr_interface.s_addr = htonl(INADDR_ANY);; //inet_addr("169.254.4.119");mreq.imr_multiaddr.s_addr = inet_addr("239.255.88.8");if (setsockopt(sock,IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) !=0){char serr[1024] = { 0 };sprintf_s(serr, "Setsock falied !   %d", WSAGetLastError());cout << "加入组播失败!" <<serr << endl;}int len = sizeof(SOCKADDR);int res = 0;char strRecv[1024] = { 0 };int coutt = 0;while (1){res = recvfrom(sock, strRecv, sizeof(strRecv), 0, (SOCKADDR*)&addr_rec, &len);if (res > 0){coutt++;cout << "recv Data :  " << strRecv << "   coutt:  " << coutt << endl;}}return 0;
}

其中最关键的是setsockopt函数的使用。

这篇关于UDP组播通信(解决端口复用的问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055620

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可