当前位置: 首页 > news >正文

C/C++ IPV6服务器socket绑定在::,接受ipv4链接(双栈)

先决条件:

1、 创建IPV6套接字

2、打开套接字可重用

3、禁用仅限 IPV6

                BOOL bEnable = FALSE;
                if (setsockopt(listenfd_, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char*>(&bEnable), sizeof(bEnable)) < 0)
                {
                    return false;
                }
 

4、绑定套接字

5、使用 struct sockaddr_in6 结构接受套接字,而不是用缺省使用 “sockaddr”,否则 10014(WSAEFAULT)错误,并导致套接字句柄泄漏。

                                struct sockaddr_in6 address = { 0 };
                                int address_size = sizeof(address);

                                int sockfd = WSAAccept(listenfd_, (sockaddr*)&address, &address_size, NULL, NULL);
                                if (sockfd != INVALID_SOCKET)
                                {
                                    AcceptSocketEventArgs e = { Adjust(sockfd) };
                                    OnAcceptSocket(e);
                                }

完整大体代码为;

        bool Open(const char* localIP, int localPort, int backlog) noexcept{if (localPort < IPEndPoint::MinPort || localPort > IPEndPoint::MaxPort){return false;}if (NULL == localIP || *localIP == '\x0'){return false;}if (listenfd_ != INVALID_SOCKET){return false;}if (NULL != hEvent_){return false;}if (NULL != afo_){return false;}if (NULL == context_){return false;}boost::system::error_code ec;boost::asio::ip::address bindIP = StringToAddress(localIP, ec);if (ec){return false;}if (backlog < 1){backlog = PPP_LISTEN_BACKLOG;}in_ = bindIP.is_v4();if (bindIP.is_v6()){struct sockaddr_in6 in6;memset(&in6, 0, sizeof(in6));in6.sin6_family = AF_INET6;in6.sin6_port = htons(localPort);if (inet_pton(AF_INET6, localIP, &in6.sin6_addr) < 1){return false;}listenfd_ = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);if (listenfd_ == INVALID_SOCKET){return false;}Adjust(listenfd_);if (!Socket::ReuseSocketAddress(listenfd_, true)){return false;}BOOL bEnable = FALSE;if (setsockopt(listenfd_, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char*>(&bEnable), sizeof(bEnable)) < 0){return false;}if (bind(listenfd_, reinterpret_cast<sockaddr*>(&in6), sizeof(in6)) < 0){return false;}}elif(bindIP.is_v4()){struct sockaddr_in in4;memset(&in4, 0, sizeof(in4));in4.sin_family = AF_INET;in4.sin_port = htons(localPort);if (inet_pton(AF_INET, localIP, &in4.sin_addr) < 1){return false;}listenfd_ = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);if (listenfd_ == INVALID_SOCKET){return false;}Adjust(listenfd_);if (!Socket::ReuseSocketAddress(listenfd_, true)){return false;}if (bind(listenfd_, reinterpret_cast<sockaddr*>(&in4), sizeof(in4)) < 0){return false;}}else{return false;}if (listen(listenfd_, backlog) < 0){return false;}hEvent_ = WSACreateEvent();if (hEvent_ == WSA_INVALID_EVENT){return false;}if (WSAEventSelect(listenfd_, hEvent_, FD_ACCEPT | FD_CLOSE) != NOERROR){return false;}afo_ = make_shared_void_pointer<boost::asio::windows::object_handle>(*context_, hEvent_);return Next();}

接受套接字连入部分:

WSANETWORKEVENTS events;
if (WSAEnumNetworkEvents(listenfd, hEvent, &events) == NOERROR)
{if (events.lNetworkEvents & FD_ACCEPT){if (events.iErrorCode[FD_ACCEPT_BIT] == 0){struct sockaddr_in6 address = { 0 };int address_size = sizeof(address);int sockfd = WSAAccept(listenfd_, (sockaddr*)&address, &address_size, NULL, NULL);if (sockfd != INVALID_SOCKET){AcceptSocketEventArgs e = { Adjust(sockfd) };OnAcceptSocket(e);}}}elif(events.lNetworkEvents & FD_CLOSE){if (events.iErrorCode[FD_ACCEPT_BIT] == 0) /* event is operation_canceled. */{return;}}
}

相关文章:

C/C++ IPV6服务器socket绑定在::,接受ipv4链接(双栈)

先决条件&#xff1a; 1、 创建IPV6套接字 2、打开套接字可重用 3、禁用仅限 IPV6 BOOL bEnable FALSE; if (setsockopt(listenfd_, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char*>(&bEnable), sizeof(bEnable)) < 0) …...

【Win10设备管理器中无端口选项】

计算机疑难杂症分享002 Win10设备管理器中无端口选项1、问题现象2、问题原因3、问题解决3.1、驱动精灵(亲测的此方法)3.2、添加过时硬件3.3、官方的方法 Win10设备管理器中无端口选项 1、问题现象 当我调试串口通信时&#xff0c;发现打开设备管理器没有端口&#xff0c;打开…...

「YashanDB迁移体验官」Oracle向YashanDB迁移的丝滑体验

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…...

实现用户个人随机salt生成jwt及鉴别用户权限的实现思路

实现用户个人随机salt生成jwt及鉴别用户权限的实现 盐值是什么&#xff1f; 盐值&#xff08;salt&#xff09;是在密码学中用于增加密码安全性的一种随机值。它通常是一个随机生成的字符串&#xff0c;与用户密码结合在一起&#xff0c;然后再进行加密处理。盐值的作用是增加…...

AI工具的热门与卓越:揭示AI技术的实际应用和影响

文章目录 每日一句正能量前言常用AI工具创新AI应用个人体验分享后记 每日一句正能量 我们在我们的劳动过程中学习思考&#xff0c;劳动的结果&#xff0c;我们认识了世界的奥妙&#xff0c;于是我们就真正来改变生活了。 前言 随着人工智能&#xff08;AI&#xff09;技术的快…...

VUE el-button指定图片背景

似乎只能通过css指定&#xff1f; 代码1 <el-button circleclass"stream0"click"switchToStream(0)" > </el-button> 代码2 <style>.stream0 {background-size: cover;background-image: url(~/assets/stream.png); } 如果要动态变…...

【ARM 嵌入式 C 入门及渐进 1.2 -- 是否为 n 字节对齐】

文章目录 是否为 n 字节对齐 是否为 n 字节对齐 在C语言中&#xff0c;你可以定义一个宏来检查一个给定地址是否是n字节对齐的。这里的n应该是2的幂&#xff08;例如&#xff0c;2、4、8、16等&#xff09;。要做到这一点&#xff0c;可以利用位操作的特性。具体地&#xff0c…...

适配qnx和linux平台的线程管理类封装

概述 封装代码仓库&#xff1a; https://gitee.com/liudegui/my_thread 尝试封装一个基于C11的多线程控制与调度类&#xff0c;适配QNX和Linux平台&#xff0c;且代码符合Misra标准。它提供了以下主要功能&#xff1a; 线程的创建与销毁管理。线程的优先级调度。线程的CPU亲…...

【信息系统项目管理师】复习~第十五章

15.项目风险管理 每个项目都存在两个层面上的风险&#xff1a;①每个项目都有会影响项目达成目标的单个风险&#xff1b;②由单个风险和不确定性的其他来源联合导致的整体项目风险。项目风险会对项目目标产生负面或正面的影响&#xff0c;也就是风险与机会。项目风险管理旨在利…...

ARM单片机实现流水灯(GD32)

根据上图可知使用的引脚分别是PA8,PE6,PF6流水灯功能的实现要分别初始化这几个引脚 流水灯实现 编写流水灯代码 LED.C #include "gd32f30x.h" // Device header #include "Delay.h" // 初始化LED灯 void LED_Init(void){// 使能RCU时钟…...

操作系统基础之磁盘

概述 基本概念 磁盘有正反两个盘面&#xff0c;每个盘面有多个同心圆&#xff0c;每个同心圆是一个磁道&#xff0c;每个同心圆又被划分为多个扇区&#xff0c;数据就被存在扇区中。 磁头首先寻找到对应磁道&#xff0c;然后等到磁盘进行周期旋转到指定的扇区&#xff0c;才…...

【Unity Shader入门精要 第6章】基础光照(一)

1. 什么是光照模型 光照原理 在真实世界中&#xff0c;我们能够看到物体&#xff0c;是由于眼睛接收到了来自观察目标的光。这里面包括两种情况&#xff1a;一部分是观察目标本身发出的光&#xff08;自发光&#xff09;直接进入我们的眼睛&#xff0c;另一部分是其他物体&am…...

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE&#xff1a; Java SE&#xff1a;指Java标准版&#xff0c;适用于各行各业&#xff0c;主要是Java…...

python把png转成jpg

在Python中&#xff0c;你可以使用PIL&#xff08;Python Imaging Library&#xff0c;也称为Pillow&#xff09;库来读取PNG图片并将其转换为JPG格式。下面是一个简单的示例代码&#xff1a; from PIL import Image# 打开PNG图片 png_image Image.open(input.png)# 保存为JP…...

信息系统架构基本概念及发展_2.信息系统架构的定义

1.几种架构的定义 信息系统架构仍在不断发展中&#xff0c;还没有形成一个公认的定义&#xff0c;这里举出几个定义。 定义1&#xff1a;软件或计算机系统的信息系统架构是该系统的一个&#xff08;或多个&#xff09;结构&#xff0c;而结构由软件元素、元素的外部可见…...

ctfshow SSRF 351-358

做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时&#xff0c;它会尝试获取该 URL 指向的资源的内容&#xff0c;并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件&#xff0c;它包含的内容取决于该 PHP 文件…...

优化学习方法,事半功倍

学习&#xff0c;是人一生中必不可少的过程。在学习的道路上&#xff0c;我们会遇到各种各样的挑战和困难&#xff0c;但只要我们能够发现并优化适合自己的学习方法&#xff0c;就能事半功倍&#xff0c;取得更好的成绩。 首先&#xff0c;要充分了解自己的学习方式和习惯。每个…...

Spring STOMP-开启STOMP

通过Spring框架的spring-messaging和spring-websocket模块&#xff0c;提供了对WebSocket上STOMP的支持。一但你添加了这些依赖项&#xff0c;你就可以像下面这个示例一样&#xff0c;通过WebSocket公开一个STOMP端点&#xff1a; import org.springframework.web.socket.conf…...

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)

什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库&#xff0c;使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;将应用程序的不同组件分离开来&#x…...

《Python编程从入门到实践》day25

# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...