TCP simultaneous open测试

源代码

/*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒************************************************************************/#pragma once#include <stdio.h>
#include <string.h>
#include <errno.h>#include <memory>#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>struct PeerMessage
{uint16_t    is_server;char        host[32];uint16_t    port;
};auto size = sizeof(PeerMessage);bool ReusePortAddr(int32_t sock, int32_t reuse = 1)
{if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char*)&reuse, sizeof(reuse))) {perror("setsockopt(SO_REUSEPORT) error");return false;}if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse))) {perror("setsockopt(SO_REUSEPORT) error");return false;}return true;
}bool TimeoutConnect(int32_t sockfd, sockaddr_in addr, uint32_t timeoutMS)
{int flags = fcntl(sockfd, F_GETFL, 0);if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0) {perror("fcntl error");}std::shared_ptr<void>(nullptr, [&](void *) {// 恢复套接字为阻塞模式fcntl(sockfd, F_SETFL, flags);});// 连接到目标地址int ret = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));if (ret < 0 && errno != EINPROGRESS) { // 连接失败且不是EINPROGRESS// EINPROGRESS 表示仍在进行连接printf("Failed to connect: [%d:%s]\n", errno, strerror(errno));return false;}// 在非阻塞模式下,需要使用 select() 或 epoll() 等函数来等待连接完成fd_set fdset;FD_ZERO(&fdset);FD_SET(sockfd, &fdset);struct timeval timeout;timeout.tv_sec = 1;timeout.tv_usec = 0;ret = select(sockfd + 1, nullptr, &fdset, nullptr, &timeout);if (ret < 0) {printf("Failed to select: [%d:%s]\n", errno, strerror(errno));return false;} else if (ret == 0) { // 超时了printf("Connection timed out\n");return false;} else {  // 连接成功或失败int valopt = -1;socklen_t optlen = sizeof(valopt);getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void*)&valopt, &optlen);  // 获取连接结果if (valopt != 0) {  // 连接失败printf("Failed to connect: [%d:%s]\n", valopt, strerror(valopt));return false;}}return true;
}
/*************************************************************************> File Name: tcp_simultaneous_open.cc> Author: hsz> Brief:> Created Time: 2024年10月25日 星期五 15时35分09秒************************************************************************/#include <iostream>
#include <string>
#include <cstring>
#include <thread>
#include <map>
#include <vector>
#include <thread>
#include <functional>#include <getopt.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>#include "common.h"#include <log/log.h>#define LOG_TAG "TCP simultaneous open"int32_t Bind(const char *local_host, uint16_t local_port)
{// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {printf("socket error, errno: %d, errstr: %s\n", errno, strerror(errno));return -1;}int32_t flag = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (char*)&flag, sizeof(flag))) {perror("setsockopt(SO_REUSEPORT) error");close(sockfd);return -1;}sockaddr_in local_addr;memset(&local_addr, 0, sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_addr.s_addr = inet_addr(local_host);local_addr.sin_port = htons(local_port);if (bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)) < 0) {perror("bind error");close(sockfd);return -1;}return sockfd;
}void thread_func(int32_t sock, const char *peer_host, uint16_t peer_port)
{sockaddr_in remote_addr;memset(&remote_addr, 0, sizeof(remote_addr));remote_addr.sin_family = AF_INET;remote_addr.sin_addr.s_addr = inet_addr(peer_host);remote_addr.sin_port = htons(peer_port);if (peer_port == 12999) {usleep(10); // usleep(1000 * 1000);}LOGI("begin");if (TimeoutConnect(sock, remote_addr, 1000)) {send(sock, "hello", 6, 0);char buf[16] = { '\0' };recv(sock, buf, sizeof(buf), 0);LOGI("recv: %s", buf);}LOGI("end");
}int main(int argc, char **argv)
{const char *bind_host = "192.168.3.10";int32_t firstSock = Bind(bind_host, 12999);int32_t secondSock = Bind(bind_host, 13999);if (firstSock < 0 || secondSock < 0) {return 0;}std::thread th1(std::bind(&thread_func, firstSock, bind_host, 13999));std::thread th2(std::bind(&thread_func, secondSock, bind_host, 12999));th1.join();th2.join();return 0;
}
测试结果

概率正常连接
抓包结果

延迟测试

由于两个套接字是客户端性质,必须保证同时处于SYN-SENT状态。
流程梳理:客户端A (127.0.0.1:12999)、客户端B(127.0.0.1:13999)
1、A向B发送SYN,此时B必须处于SYN-SENT状态,否则就会因为是客户端性质而收到RST信号
2、A收到RST信号后进入CLOSED 状态,此时B在延迟1ms后发送SYN,将同样收到RST信号

延迟探测

经过多次测试,延迟 5 - 20 微秒的概率会增大,如tcpdump的图,12999发送SYN的时间点是16:19:20.330111
收到SYN-ACK的时间点是16:19:20.330134,间隔了 23 微秒

后话

以上测试仅限本地。
公网环境存在传输时间,如果同时发送理论上能连接上的概率更大

参考

http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-4.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转录组上游分析流程(三)

环境部署——数据下载——查看数据(非质控)——数据质控——数据过滤(过滤低质量数据) 测序得到的原始序列含有接头序列和低质量序列&#xff0c;为了保证信息分析的准确性&#xff0c;需要对原始数据进行质量控制&#xff0c;得到高质量序列(Clean Reads)&#xff0c;原始序列…

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…

(二十三)Java反射

1.反射概念 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问&#xff0c;通俗理解就是允许从类里面拿东西&#xff0c;用途有提示词等&#xff0c;如下所示都是通过反射实现的 所以&#xff0c;学习反射就是学习从字节码class文件中获取成员信息并且对其…

stable diffusion WEBUI Brief summary

1&#xff0c;rembg(去除背景-》蒙版) import rembg from PIL import Image, ImageOps import numpy as np# 打开图像 input_path "./p_6258838.jpg" input_image Image.open(input_path)# 移除背景&#xff0c;得到带有透明背景的图像 output_image rembg.remove…

利用大模型进行复杂决策制定:PlanRAG技术的研究

人工智能咨询培训老师叶梓 转载标明出处 有效的决策制定对于组织的成功至关重要。传统的决策支持系统虽然在数据分析和决策辅助方面取得了一定的进展&#xff0c;但在处理需要复杂数据分析的决策问题时仍显不足。为了解决这一问题&#xff0c;来自韩国高等科学技术院&#xff…

fpga系列 HDL: 竞争和冒险 01

卡诺图是一种逻辑化简工具&#xff0c;用来在布尔函数的最小项和形式中&#xff0c;找到冗余项并实现逻辑化简。也可用于HDL中竞争和冒险的判断。 最小项 任何一个逻辑函数都能化简为最小项的和的形式对于 n 个变量的布尔表达式&#xff0c;每个变量都必须以原变量&#xff0…

Zabbix企业级分布式监控环境部署

“运筹帷幄之中&#xff0c;决胜千里之外”。在IT运维中&#xff0c;监控占据着重要的地位&#xff0c;按比例来算&#xff0c;说占30%一点也不为过。对IT运维工程师来说&#xff0c;构建一个真正可用的监控告警系统是一项艰巨的任务。在监控系统的开源软件中&#xff0c;可供选…

基于模型划分的云边协同推理算法

摘要 在网络状态和任务需求的动态变化下&#xff0c;为减少模型推理时延和计算成本&#xff0c;在软件定义网络( Software Defined Network&#xff0c;SDN) 中提出了一种基于模型划分的云边协同推理算法。通过构建复杂度预测器分配任务执行环境&#xff0c;采用深度Q网络(Dee…

国产标准数字隔离器的未来---克里雅半导体

标准数字隔离器是电信号隔离技术的重要组成部分&#xff0c;近年来取得了重大进展。随着工业自动化、汽车电子和电信等行业对更高性能的需求不断增长&#xff0c;国内数字隔离器制造商正在稳步赶上全球标准。本文讨论了数字隔离器技术的新兴趋势、材料创新的影响&#xff0c;以…

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁&#xff1a;确保操作系统始终安装最新补丁&#xff0c;以防范系统漏洞。例如&#xff0c;Windows Server 定期推送安全更新&#xff0c;修复如远程代码执行等潜在威胁。优化系统服务配置&#xff1a;关闭不…

一家医药企业终止,收入依赖阿里健康,学术推广费快赶上净利润

知原药业终止原因如下&#xff1a;知原药业报告期三年的推广费用超3亿元&#xff0c;快赶上这三年累计3.68亿元的净利润了&#xff0c;交易所质疑其学术推广费单价合理性、是否存在销售返利。并且&#xff0c;公司研发费用率低于行业平均水平&#xff0c;在电商平台营销主要依赖…

pytorh学习笔记——cifar10(三)模仿VGGNet创建卷积网络

VGG16是由牛津大学视觉几何组&#xff08;Visual Geometry Group&#xff09;提出的一种深度卷积神经网络模型。 VGGNet 探索了卷积神经网络的深度与其性能之间的关系&#xff0c;成功地构筑了 16~19 层深的卷积神经网络&#xff0c;同时拓展性又很强&#xff0c;迁移到其它图片…

【LeetCode】11.盛最多水的容器

思路&#xff1a; 利用双指针法进行移动&#xff0c;一个在头一个在尾&#xff0c;此时宽度最宽&#xff0c;当宽度缩小时&#xff0c;高度发生变化&#xff0c;从而可以找到最大值。 代码&#xff1a; int maxArea(int* height, int heightSize) {int* left height;int* …

仿真学习 | Fluent版本迭代一览及选择指南

在计算机辅助工程&#xff08;CAE&#xff09;领域&#xff0c;软件版本的更新迭代&#xff0c;影响了工程师的工作效率、工作习惯和仿真精度&#xff0c;“如何选择软件版本”也永远是摆在每个初学者面前的第一个难题。 计算流体动力学&#xff08;CFD&#xff09;领域的领军…

嵌入式工程师必备——NTC曲线拟合

最近搞了一下NTC热敏电阻&#xff0c;打算和大家分享一下&#xff1b; 首先看NTC手册&#xff0c;25℃时是5K&#xff0c;温度系数B是3470&#xff0c;有一些NTC会直接给出公式&#xff0c;那种直接按照手册计算就好&#xff1b; 1、下面是温度和阻值对照表&#xff0c;这个表…

深度学习:YOLO目标检测和YOLO-V1算法损失函数的计算

简介 YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;它的核心思想是将目标检测问题转化为一个回归问题&#xff0c;通过一个神经网络直接预测目标的类别和位置。 YOLO算法将输入图像分成SxS个网格&#xff0c;每个网格负责预测…

Golang | Leetcode Golang题解之第498题对角线遍历

题目&#xff1a; 题解&#xff1a; func findDiagonalOrder(mat [][]int) []int {m, n : len(mat), len(mat[0])ans : make([]int, 0, m*n)for i : 0; i < mn-1; i {if i%2 1 {x : max(i-n1, 0)y : min(i, n-1)for x < m && y > 0 {ans append(ans, mat[x…

uni-app微信小程序如何使用高德地图。通过经纬度获取所在城市

高德地图官方是这样介绍的使用方法可以参考&#xff1a;入门指南-微信小程序插件 | 高德地图API 我再介绍一下我得具体应用。 1&#xff0c;首先要在申请高德地图开放平台得账号。然后在这个账号中申请一个应用。类型选择微信小程序。 我的应用 | 高德控制台 获取Key-创建工…

怎样把学生的成绩单独告知家长?

期中考试季的到来让校园里的气氛似乎也变得紧张起来。家长们开始频繁地联系老师&#xff0c;希望了解孩子的表现&#xff1b;孩子们则在考试后&#xff0c;绞尽脑汁地想出各种理由&#xff0c;以期在成绩不理想时能减轻家长的失望。老师们更是忙得不可开交&#xff0c;不仅要批…

C++(标准输入输出流、命名空间、string字符串、引用)

C特点及优势 &#xff08;1&#xff09;实现了面向对象&#xff0c;在高级语言中&#xff0c;处理运行速度是最快&#xff1b; &#xff08;2&#xff09;非常灵活&#xff0c;功能非常强大&#xff0c;相对于C的指针优势&#xff0c;C的优势为性能和类层次结构&#x…