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

TCP和UDP可以同时绑定相同的端口吗?

之前有读者在字节面试的时候被问到TCP 和 UDP 可以同时监听相同的端口吗关于端口的知识点还是挺多可以讲的比如还可以牵扯到这几个问题多个 TCP 服务进程可以同时绑定同一个端口吗客户端的端口可以重复使用吗客户端 TCP 连接 TIME_WAIT 状态过多会导致端口资源耗尽而无法建立新的连接吗所以这次就跟大家盘一盘这些问题。TCP 和 UDP 可以同时绑定相同的端口吗其实我感觉这个问题「TCP 和 UDP 可以同时监听相同的端口吗」表述有问题这个问题应该表述成「TCP 和 UDP 可以同时绑定相同的端口吗」因为「监听」这个动作是在 TCP 服务端网络编程中才具有的而 UDP 服务端网络编程中是没有「监听」这个动作的。TCP 和 UDP 服务端网络相似的一个地方就是会调用 bind 绑定端口。给大家贴一下 TCP 和 UDP 网络编程的区别就知道了。TCP 网络编程如下服务端执行 listen() 系统调用就是监听端口的动作。TCP 网络编程UDP 网络编程如下服务端是没有监听这个动作的只有执行 bind() 系统调用来绑定端口的动作。UDP 网络编程TCP 和 UDP 可以同时绑定相同的端口吗答案可以的。在数据链路层中通过 MAC 地址来寻找局域网中的主机。在网际层中通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中需要通过端口进行寻址来识别同一计算机中同时通信的不同应用程序。所以传输层的「端口号」的作用是为了区分同一个主机上不同应用程序的数据包。传输层有两个传输协议分别是 TCP 和 UDP在内核中是两个完全独立的软件模块。当主机收到数据包后可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP所以可以根据这个信息确定送给哪个模块TCP/UDP处理送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。因此 TCP/UDP 各自的端口号也相互独立如 TCP 有一个 80 号端口UDP 也可以有一个 80 号端口二者并不冲突。验证结果我简单写了 TCP 和 UDP 服务端的程序它们都绑定同一个端口号 8888。运行这两个程序后通过 netstat 命令可以看到TCP 和 UDP 是可以同时绑定同一个端口号的。多个 TCP 服务进程可以绑定同一个端口吗还是以前面的 TCP 服务端程序作为例子启动两个同时绑定同一个端口的 TCP 服务进程。运行第一个 TCP 服务进程之后netstat 命令可以查看8888 端口已经被一个 TCP 服务进程绑定并监听了如下图接着运行第二个 TCP 服务进程的时候就报错了“Address already in use”如下图我上面的测试案例是两个 TCP 服务进程同时绑定地址和端口是0.0.0.0 地址和8888端口所以才出现的错误。如果两个 TCP 服务进程绑定的 IP 地址不同而端口相同的话也是可以绑定成功的如下图所以默认情况下针对「多个 TCP 服务进程可以绑定同一个端口吗」这个问题的答案是如果两个 TCP 服务进程同时绑定的 IP 地址和端口都相同那么执行 bind() 时候就会出错错误是“Address already in use”。注意如果 TCP 服务进程 A 绑定的地址是 0.0.0.0 和端口 8888而如果 TCP 服务进程 B 绑定的地址是 192.168.1.100 地址或者其他地址和端口 8888那么执行 bind() 时候也会出错。这是因为 0.0.0.0 地址比较特殊代表任意地址意味着绑定了 0.0.0.0 地址相当于把主机上的所有 IP 地址都绑定了。重启 TCP 服务进程时为什么会有“Address in use”的报错信息TCP 服务进程需要绑定一个 IP 地址和一个端口然后就监听在这个地址和端口上等待客户端连接的到来。然后在实践中我们可能会经常碰到一个问题当 TCP 服务进程重启之后总是碰到“Address in use”的报错信息TCP 服务进程不能很快地重启而是要过一会才能重启成功。这是为什么呢当我们重启 TCP 服务进程的时候意味着通过服务器端发起了关闭连接操作于是就会经过四次挥手而对于主动关闭方会在 TIME_WAIT 这个状态里停留一段时间这个时间大约为 2MSL。当 TCP 服务进程重启时服务端会出现 TIME_WAIT 状态的连接TIME_WAIT 状态的连接使用的 IPPORT 仍然被认为是一个有效的 IPPORT 组合相同机器上不能够在该 IPPORT 组合上进行绑定那么执行 bind() 函数的时候就会返回了 Address already in use 的错误。而等 TIME_WAIT 状态的连接结束后重启 TCP 服务进程就能成功。重启 TCP 服务进程时如何避免“Address in use”的报错信息我们可以在调用 bind 前对 socket 设置 SO_REUSEADDR 属性可以解决这个问题。int on 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on));因为 SO_REUSEADDR 作用是如果当前启动进程绑定的 IPPORT 与处于TIME_WAIT 状态的连接占用的 IPPORT 存在冲突但是新启动的进程使用了 SO_REUSEADDR 选项那么该进程就可以绑定成功。举个例子服务端有个监听 0.0.0.0 地址和 8888 端口的 TCP 服务进程。‍有个客户端IP地址192.168.1.100已经和服务端IP 地址172.19.11.200建立了 TCP 连接那么在 TCP 服务进程重启时服务端会与客户端经历四次挥手服务端的 TCP 连接会短暂处于 TIME_WAIT 状态客户端地址:端口 服务端地址:端口 TCP 连接状态 192.168.1.100:37272 172.19.11.200:8888 TIME_WAIT如果 TCP 服务进程没有对 socket 设置 SO_REUSEADDR 属性那么在重启时由于存在一个和绑定 IPPORT 一样的 TIME_WAIT 状态的连接那么在执行 bind() 函数的时候就会返回了 Address already in use 的错误。如果 TCP 服务进程对 socket 设置 SO_REUSEADDR 属性了那么在重启时即使存在一个和绑定 IPPORT一样的 TIME_WAIT 状态的连接依然可以正常绑定成功因此可以正常重启成功。因此在所有 TCP 服务器程序中调用 bind 之前最好对 socket 设置 SO_REUSEADDR 属性这不会产生危害相反它会帮助我们在很快时间内重启服务端程序。‍前面我提到过这个问题如果 TCP 服务进程 A 绑定的地址是 0.0.0.0 和端口 8888而如果 TCP 服务进程 B 绑定的地址是 192.168.1.100 地址或者其他地址和端口 8888那么执行 bind() 时候也会出错。这个问题也可以由 SO_REUSEADDR 解决因为它的另外一个作用是绑定的 IP地址 端口时只要 IP 地址不是正好(exactly)相同那么允许绑定。比如0.0.0.0:8888 和192.168.1.100:8888虽然逻辑意义上前者包含了后者但是 0.0.0.0 泛指所有本地 IP而 192.168.0.100 特指某一IP两者并不是完全相同所以在对 socket 设置 SO_REUSEADDR 属性后那么执行 bind() 时候就会绑定成功。客户端的端口可以重复使用吗客户端在执行 connect 函数的时候会在内核里随机选择一个端口然后向服务端发起 SYN 报文然后与服务端进行三次握手。所以客户端的端口选择的发生在 connect 函数内核在选择端口的时候会从 net.ipv4.ip_local_port_range 这个内核参数指定的范围来选取一个端口作为客户端端口。该参数的默认值是 32768 61000意味着端口总可用的数量是 61000 - 32768 28232 个。当客户端与服务端完成 TCP 连接建立后我们可以通过 netstat 命令查看 TCP 连接。$ netstat -napt 协议 源ip地址:端口 目的ip地址端口 状态 tcp 192.168.110.182.64992 117.147.199.51.443 ESTABLISHED那问题来了上面客户端已经用了 64992 端口那么还可以继续使用该端口发起连接吗这个问题很多同学都会说不可以继续使用该端口了如果按这个理解的话 默认情况下客户端可以选择的端口是 28232 个那么意味着客户端只能最多建立 28232 个 TCP 连接如果真是这样的话那么这个客户端并发连接也太少了吧所以这是错误理解。正确的理解是TCP 连接是由四元组源IP地址源端口目的IP地址目的端口唯一确认的那么只要四元组中其中一个元素发生了变化那么就表示不同的 TCP 连接的。所以如果客户端已使用端口 64992 与服务端 A 建立了连接那么客户端要与服务端 B 建立连接还是可以使用端口 64992 的因为内核是通过四元祖信息来定位一个 TCP 连接的并不会因为客户端的端口号相同而导致连接冲突的问题。比如下面这张图有 2 个 TCP 连接左边是客户端右边是服务端客户端使用了相同的端口 50004 与两个服务端建立了 TCP 连接。仔细看上面这两条 TCP 连接的四元组信息中的「目的 IP 地址」是不同的一个是 180.101.49.12 另外一个是 180.101.49.11。多个客户端可以 bind 同一个端口吗bind 函数虽然常用于服务端网络编程中但是它也是用于客户端的。前面我们知道客户端是在调用 connect 函数的时候由内核随机选取一个端口作为连接的端口。而如果我们想自己指定连接的端口就可以用 bind 函数来实现客户端先通过 bind 函数绑定一个端口然后调用 connect 函数就会跳过端口选择的过程了转而使用 bind 时确定的端口。针对这个问题多个客户端可以 bind 同一个端口吗要看多个客户端绑定的 IP PORT 是否都相同如果都是相同的那么在执行 bind() 时候就会出错错误是“Address already in use”。如果一个绑定在 192.168.1.100:6666一个绑定在 192.168.1.200:6666因为 IP 不相同所以执行 bind() 的时候能正常绑定。所以 如果多个客户端同时绑定的 IP 地址和端口都是相同的那么执行 bind() 时候就会出错错误是“Address already in use”。一般而言客户端不建议使用 bind 函数应该交由 connect 函数来选择端口会比较好因为客户端的端口通常都没什么意义。客户端 TCP 连接 TIME_WAIT 状态过多会导致端口资源耗尽而无法建立新的连接吗针对这个问题要看客户端是否都是与同一个服务器目标地址和目标端口一样建立连接。如果客户端都是与同一个服务器目标地址和目标端口一样建立连接那么如果客户端 TIME_WAIT 状态的连接过多当端口资源被耗尽就无法与这个服务器再建立连接了。但是因为只要客户端连接的服务器不同端口资源可以重复使用的。所以如果客户端都是与不同的服务器建立连接即使客户端端口资源只有几万个 客户端发起百万级连接也是没问题的当然这个过程还会受限于其他资源比如文件描述符、内存、CPU 等。如何解决客户端 TCP 连接 TIME_WAIT 过多导致无法与同一个服务器建立连接的问题前面我们提到如果客户端都是与同一个服务器目标地址和目标端口一样建立连接那么如果客户端 TIME_WAIT 状态的连接过多当端口资源被耗尽就无法与这个服务器再建立连接了。针对这个问题也是有解决办法的那就是打开 net.ipv4.tcp_tw_reuse 这个内核参数。因为开启了这个内核参数后客户端调用 connect 函数时如果选择到的端口已经被相同四元组的连接占用的时候就会判断该连接是否处于 TIME_WAIT 状态如果该连接处于 TIME_WAIT 状态并且 TIME_WAIT 状态持续的时间超过了 1 秒那么就会重用这个连接然后就可以正常使用该端口了。举个例子假设客户端已经与服务器建立了一个 TCP 连接并且这个状态处于 TIME_WAIT 状态客户端地址:端口 服务端地址:端口 TCP 连接状态 192.168.1.100:2222 172.19.11.21:8888 TIME_WAIT然后客户端又与该服务器172.19.11.21:8888发起了连接在调用 connect 函数时内核刚好选择了 2222 端口接着发现已经被相同四元组的连接占用了如果没有开启net.ipv4.tcp_tw_reuse 内核参数那么内核就会选择下一个端口然后继续判断直到找到一个没有被相同四元组的连接使用的端口 如果端口资源耗尽还是没找到那么 connect 函数就会返回错误。如果开启了 net.ipv4.tcp_tw_reuse 内核参数就会判断该四元组的连接状态是否处于 TIME_WAIT 状态如果连接处于 TIME_WAIT 状态并且该状态持续的时间超过了 1 秒那么就会重用该连接于是就可以使用 2222 端口了这时 connect 就会返回成功。再次提醒一次开启了 net.ipv4.tcp_tw_reuse 内核参数是客户端连接发起方 在调用 connect() 函数时才起作用所以在服务端开启这个参数是没有效果的。客户端端口选择的流程总结至此我们已经把客户端在执行 connect 函数时内核选择端口的情况大致说了一遍为了让大家更明白客户端端口的选择过程我画了一流程图。总结TCP 和 UDP 可以同时绑定相同的端口吗可以的。TCP 和 UDP 传输协议在内核中是由两个完全独立的软件模块实现的。当主机收到数据包后可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP所以可以根据这个信息确定送给哪个模块TCP/UDP处理送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。因此 TCP/UDP 各自的端口号也相互独立互不影响。多个 TCP 服务进程可以同时绑定同一个端口吗如果两个 TCP 服务进程同时绑定的 IP 地址和端口都相同那么执行 bind() 时候就会出错错误是“Address already in use”。如果两个 TCP 服务进程绑定的端口都相同而 IP 地址不同那么执行 bind() 不会出错。如何解决服务端重启时报错“Address already in use”的问题当我们重启 TCP 服务进程的时候意味着通过服务器端发起了关闭连接操作于是就会经过四次挥手而对于主动关闭方会在 TIME_WAIT 这个状态里停留一段时间这个时间大约为 2MSL。当 TCP 服务进程重启时服务端会出现 TIME_WAIT 状态的连接TIME_WAIT 状态的连接使用的 IPPORT 仍然被认为是一个有效的 IPPORT 组合相同机器上不能够在该 IPPORT 组合上进行绑定那么执行 bind() 函数的时候就会返回了 Address already in use 的错误。要解决这个问题我们可以对 socket 设置 SO_REUSEADDR 属性。这样即使存在一个和绑定 IPPORT一样的 TIME_WAIT 状态的连接依然可以正常绑定成功因此可以正常重启成功。客户端的端口可以重复使用吗在客户端执行 connect 函数的时候只要客户端连接的服务器不是同一个内核允许端口重复使用。TCP 连接是由四元组源IP地址源端口目的IP地址目的端口唯一确认的那么只要四元组中其中一个元素发生了变化那么就表示不同的 TCP 连接的。所以如果客户端已使用端口 64992 与服务端 A 建立了连接那么客户端要与服务端 B 建立连接还是可以使用端口 64992 的因为内核是通过四元祖信息来定位一个 TCP 连接的并不会因为客户端的端口号相同而导致连接冲突的问题。客户端 TCP 连接 TIME_WAIT 状态过多会导致端口资源耗尽而无法建立新的连接吗要看客户端是否都是与同一个服务器目标地址和目标端口一样建立连接。如果客户端都是与同一个服务器目标地址和目标端口一样建立连接那么如果客户端 TIME_WAIT 状态的连接过多当端口资源被耗尽就无法与这个服务器再建立连接了。即使在这种状态下还是可以与其他服务器建立连接的只要客户端连接的服务器不是同一个那么端口是重复使用的。如何解决客户端 TCP 连接 TIME_WAIT 过多导致无法与同一个服务器建立连接的问题打开 net.ipv4.tcp_tw_reuse 这个内核参数。因为开启了这个内核参数后客户端调用 connect 函数时如果选择到的端口已经被相同四元组的连接占用的时候就会判断该连接是否处于 TIME_WAIT 状态。如果该连接处于 TIME_WAIT 状态并且 TIME_WAIT 状态持续的时间超过了 1 秒那么就会重用这个连接然后就可以正常使用该端口了。完搞定

相关文章:

TCP和UDP可以同时绑定相同的端口吗?

之前有读者在字节面试的时候,被问到:TCP 和 UDP 可以同时监听相同的端口吗?关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题:多个 TCP 服务进程可以同时绑定同一个端口吗?客户端…...

基于 IWR6843毫米波雷达 的多人跟踪与跌倒检测系统

这是一个面向室内人体感知场景的毫米波雷达项目,核心功能是:多人目标实时跟踪 跌倒检测可视化。项目基于 IWR6843 DCA1000 实现,页面可以直接完成雷达配置、实时目标显示、轨迹跟踪和跌倒告警展示,适合做演示、方案展示和二次开…...

3分钟掌握RePKG:Wallpaper Engine资源提取与转换全攻略

3分钟掌握RePKG:Wallpaper Engine资源提取与转换全攻略 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的强大资源提取工具&#x…...

4大维度精通ExtendScript反编译:开发者必备的JSXBIN解析指南

4大维度精通ExtendScript反编译:开发者必备的JSXBIN解析指南 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer ExtendScript反编译是Adobe生态开发者必备的核心技能,而Jsxer作…...

掌控微信数据:从信息丢失到价值挖掘的完整解决方案

掌控微信数据:从信息丢失到价值挖掘的完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMs…...

腾讯优图Youtu-Parsing案例分享:手写体、印章、图表精准识别效果

腾讯优图Youtu-Parsing案例分享:手写体、印章、图表精准识别效果 1. 文档解析的新标杆 在日常工作中,我们经常遇到这样的场景:收到一份扫描的合同,需要提取关键条款;拿到一份手写笔记,想要转为电子版&…...

OpenClaw开源贡献:为gemma-3-12b-it开发并共享自定义技能

OpenClaw开源贡献:为gemma-3-12b-it开发并共享自定义技能 1. 为什么选择为gemma-3-12b-it开发技能 去年冬天第一次接触OpenClaw时,我就被它的设计理念吸引了——一个真正能在本地运行的AI智能体框架。当时我正为重复性的数据清洗工作头疼,而…...

别再为视频生成发愁了!用ComfyUI+Wan 2.1,保姆级本地部署教程(附工作流文件)

从零到一:ComfyUI与Wan 2.1的本地视频生成实战指南 如果你曾经被AI视频生成工具的复杂配置劝退,或是厌倦了云端服务的漫长等待和隐私顾虑,今天这份指南将彻底改变你的创作体验。我们将深入探索如何利用ComfyUI框架和Wan 2.1模型,…...

Redis哨兵模式内存缩容

Redis哨兵模式内存缩容检查节点信息从节点内存缩容最大内存配置修改停机缩容缩容后检查主节点内存缩容回退操作检查节点信息 通过哨兵获取集群名和主节点地址: # docker exec -it pod_sentinel_1 redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:…...

黑客 比普通 程序员 高在哪里?

黑客比普通程序员高在哪里? 99%的程序员:搜,拿,改。纯自己手写个贪吃蛇小游戏都费劲。 99%的黑客:下,扫,查。离开下载的工具,徒手找个网页注入点都费劲。 没几个有真本事的。都瞎掰。骗骗小孩…...

基于 LangChain 1.0 的 LangGraph 高级应用

基于 LangChain 1.0 的 LangGraph 高级应用 文章目录基于 LangChain 1.0 的 LangGraph 高级应用1. 深度对比:Workflow vs Agent1.1 Workflow 实现示例(内容审核)1.2 Agent 实现示例(内容审核)2. 高级状态管理&#xff…...

反激变换器磁学分析

一、反激变换器变压器功能及其占空比图1如图1所示,为反激变换器拓扑,变压器一次绕组匝数和变压器二次绕组匝数之比为;反激变换器变压器功能:由图1中正负号所示,一次绕组和二次绕组的感应电压方向相反,当开关…...

3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南

3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-ma…...

Claude Computer Use:AI 操控电脑的革命性突破详解

Claude Computer Use:AI 操控电脑的革命性突破详解 引言 2024 年,Anthropic 公司推出了 Claude 3.5 Sonnet 模型,并首次引入了Computer Use(电脑使用)功能。这项技术标志着 AI 从单纯的对话助手向能够实际操作电脑的自主代理迈出了重要一步。本文将深入解析 Claude Comp…...

跨场景事件:没人聊但人人踩的持久化问题

目录根本矛盾静态事件:幽灵订阅问题实例事件:随场景消亡DontDestroyOnLoad 创可贴Bootstrap 场景模式多场景编辑让情况更糟生命周期问题GES 如何解决这个问题ScriptableObject 事件存在于场景之外Behavior Window:自动生命周期管理Persistent…...

论文写作“神器大比拼”:好写作AI凭实力“出圈”

在学术的漫漫征途中,论文写作就像是一场艰难的马拉松,从构思选题到组织内容,再到打磨润色,每一步都充满挑战。而如今,AI写作软件如雨后春笋般涌现,为论文写作者们带来了新的希望和助力。但面对琳琅满目的选…...

学Simulink——基于Simulink的单位功率因数(UPF)整流控制策略

目录 手把手教你学Simulink ——基于Simulink的单位功率因数(UPF)整流控制策略 一、问题背景 二、UPF 控制原理 1. 功率因数定义 2. dq 坐标系下的解耦控制 三、系统架构 四、Simulink 建模步骤 第一步:搭建主电路 第二步:实现锁相环(PLL) 第三步:坐标变换 第…...

告别‘电音’:用WaveRNN和FFTNet给你的AI语音合成项目选个又快又好的声码器

神经声码器选型实战:从WaveRNN到FFTNet的高效语音合成方案 语音合成技术正在经历一场由深度学习驱动的革命,而声码器(Vocoder)作为将频谱特征转换为自然波形的关键组件,其性能直接影响着合成语音的质量和效率。面对市…...

学Simulink——基于Simulink的固定频率滞环电流控制Boost变换器

目录 手把手教你学Simulink——基于Simulink的固定频率滞环电流控制Boost变换器​ 摘要​ 一、背景与挑战​ 1.1 Boost变换器电流控制的痛点与传统方法局限​ 1.1.1 应用场景与核心指标​ 1.1.2 传统控制的缺陷​ 1.2 固定频率滞环电流控制的核心优势​ 1.3 设计目标​ …...

B站成分检测器深度解析:5大革新特性重塑评论区交互体验

B站成分检测器深度解析:5大革新特性重塑评论区交互体验 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分油猴脚本,主要为原神玩家识别 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-comment-checker 在B站的海量评论互…...

力扣第97题:多数元素

第一部分:问题描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums = [3,2,3] 输出:3 示例 2: 输入:nums = [2,2,1,1,1…...

高效挖掘论文开源项目的五大实战平台

1. 科研必备:五大开源代码平台全景解析 刚入行AI那会儿,最头疼的就是复现论文。明明算法原理都看懂了,可一动手就发现作者留了"课后习题"——关键实现细节全在"详见代码"四个字里。后来我摸索出一套方法论:与…...

计算机应届生:简历好看≠能过面试

文章目录 前言一、简历"P图":美颜开过头,见面就翻车二、面试的"黑盒":你以为在考八股文,其实在考思维模型三、项目经历的"坑":你的秒杀系统,可能只是个Hello World四、技术深…...

1520上市公司企业短期并购绩效和长期并购绩效数据+dofile(2008-2022)

数据来源参考《管理世界》陈仕华老师的做法,详情点击查看更多详情信息时间跨度2008-2022区域跨度企业数据格式dta/excel数据简介今天数据皮皮侠团队为大家分享一份最新的上市公司企业短期并购绩效和长期并购绩效数据,供大家研究使用。数据指标上市公司企…...

实战指南:基于快马平台生成vscode电商后台管理项目脚手架

最近在做一个电商后台管理系统的前端项目,正好尝试了用InsCode(快马)平台来生成项目脚手架,整个过程比我预想的要顺畅很多。作为一个经常用VSCode开发的前端工程师,这次体验让我发现原来项目初始化可以这么高效。下面分享下具体实现过程和几点…...

5分钟快速搭建PUBG实时雷达:掌握战场信息的终极指南

5分钟快速搭建PUBG实时雷达:掌握战场信息的终极指南 【免费下载链接】PUBG-maphack-map this is a working copy online-map from jussihi/PUBG-map-hack, use nodejs webserver instead of firebase. 项目地址: https://gitcode.com/gh_mirrors/pu/PUBG-maphack-…...

3分钟快速上手WindowResizer:终极窗口强制调整工具

3分钟快速上手WindowResizer:终极窗口强制调整工具 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽大小的应用程序窗口而烦恼吗?WindowR…...

鸿蒙物联网开发教程-第八章 网络请求1

第八章 网络请求 8.1 网络请求概述 鸿蒙应用中的网络请求主要使用fetch API或@ohos.net.http模块进行网络通信。网络请求用于: 获取远程数据 上传数据到服务器 与物联网平台通信 调用第三方API 8.2 HTTP请求 8.2.1 使用fetch API // 发送GET请求fetch(‘https://api.e…...

Qwen3-VL:30B部署实操:Clawdbot配置文件详解、飞书Bot权限申请与事件订阅最佳实践

Qwen3-VL:30B部署实操:Clawdbot配置文件详解、飞书Bot权限申请与事件订阅最佳实践 1. 项目概述与准备工作 1.1 项目介绍 本项目将带你从零开始,在CSDN星图AI云平台上私有化部署最强的多模态大模型Qwen3-VL:30B,并通过Clawdbot搭建一个既能…...

QT——计算器核心算法

1.中缀表达式转后缀表达式(1)分离算法(数字和符号分离)中缀表达式中包含:数字和小数点、符号位(或-)、运算符(-*/)、括号思想:以符号作为标志对表达式中的字符逐个访问当前字符exp[i…...