一、引言
VeryCD emule 自去年推出LowToLow功能以来,经过很多网友热心的测试, 到限制为止已经比较稳定的运行了,VeryCD emule 是一个开源软件,我们遵循GPL的开放精神,开放了所有代码,但是emule的各项功能都有很大的完善空间, 我们相信还有很多网络编程爱好者热爱emule这个软件,但是由于没有相关的文档资料,估计想参与的网友可能也不知道该从何下手,因此我们准备在这里陆续贴出些资料,期待更多编程爱好者、网络系统架构师能参与进来,大家一起来完善改进emule这个优秀的P2P软件,大家一起来分享知识,分享编程的乐趣。
二、VeryCD emule L2L相关类简介和架构图
穿透功能代码主要在以下文件中实现:
NatThread.cpp、NatSocket.hcpp、 TraverseBySourceExchange.cpp、TraverseBySvr.cpp、
TraverseStrategy.cpp、 SourceExchangeNAT.cpp
它们主要完成以下类的的具体功能:
CNatThread: 穿透功能的工作线程
CNatSocket: 穿透成功,用于Peer之间通讯(也即FakeTcpSocket,用UDP模拟TCP通信,在这个类中的一些发送接收数据处理的算法我们采用了emule neo Mode的一些实现代码)
CTraverseFactory 策略工厂,创建策略组合
CTraverseBySvr 基于服务器穿透的策略类
CTraverseBySourceExchange 基于源交换穿透的策略类
CUnconnSocket 被动方收到穿透请求,创建CUnconnSocket,开始穿透
CTraverseStrategy 穿透策略类的基类
CSourceExchangeNAT 处理源交换穿透命令
系统静态结构图如下:
三、实现思路
CAsyncSocketEx是TCP socket,emule通过它把数据发送出去。我们扩展了CAsyncSocketEx的Connect, Send, Receive三个函数。如果是穿透连接的话,走UDP穿透的通道,否则就按原来的TCP传输。
这样的好处是:
1 合理性。我们是改进数据传输方式,应该只改动传输相关的类(即CAsyncSocketEx),其它地方代码不应该受到大的改动,对其它逻辑不应该有大的影响。
2 架构上耦合度小。主要是CAsyncSocketEx跟穿透有关系,代码与官方同步时Merge的工作量小。
3. 对上层透明。上层不必关心Peer是不是Low2Low的Peer。
穿透原理图如下
[下一次我们会具体介绍每个类的内部实现机理和一些算法策略,待续...]
mail: emuledev@VeryCD.com
Ps: 转载请注明出处 VeryCD emule 软件开发组 (文档编写yunchenn)
相关推荐
u3d逆向学习之纯C内存读写与ImGui绘制(Android)
方法:需要在/proc/pid/maps文件查找模块名,一行行遍历所有内存,第一个参数为模块名,第二个参数为索引index(因为该模块会有多个,index为正序遍历第index个该模块),若找到了则使用。32位游戏的指针大小采用4字节,而64位游戏的指针大小采用8字节(这里需要注意),数据地址以16进制存储,使用unsigned long类型 ,该函数只有一个参数,数据地址,返回该地址的指针跳转地址。文件,比较其中的内容是否与传入的包名相同,如果相同,则返回该进程的PID。
emule udp 穿透传文件
一、引言 VeryCD emule 自去年推出LowToLow功能以来,经过很多网友热心的测试, 到限制为止已经比较稳定的运行了,VeryCD emule 是一个开源软件,我们遵循GPL的开放精神,开放了所有代码,但是emule的各项功能都有很大的完善空间, 我们相信还有很多网络编程爱好者热爱emule这个软件,但是由于没有相关的文档资料,估计想参与的网友可能也不知道该从何下手,因此我们准备
Seafile搭建以及onlyoffice在线办公
部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE
68.168.16.153/forum/index.php,BT没死!305个国外BT资源聚合站点大全
1. BTChina关门不代表BT死了,2. VeryCD停业不代表Emule不能用了!3. PS:好好利用emule自己的搜索功能4. CDMSSharehttp://www.cdmsshare.org/5. Descargatorrenthttp://descargatorrent.webcindario.com/6. eChule.NEThttp://www.echule.net/7. El...
Avalonia跨平台开发入门:从安装到运行第一个应用(Windows/Linux/macOS)
本文详细介绍了Avalonia跨平台开发的基础入门指南,从安装到运行第一个应用的全过程。涵盖Windows、Linux和macOS三大平台的环境配置,特别推荐使用Visual Studio进行开发,并提供常见问题的解决方案,帮助开发者快速上手Avalonia框架。
稳定性性能系列之五——Native Crash深度分析:工具实战
深入理解Native Crash的机制与分析方法,掌握addr2line、ndk-stack、gdb等核心工具的实战使用,学会从Tombstone文件中快速定位问题根因
视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界
在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。
ABAQUS中CDP模型在钢筋混凝土节点低周反复荷载模拟的关键技术解析
本文深入解析了ABAQUS中CDP模型在钢筋混凝土节点低周反复荷载模拟中的关键技术。通过详细介绍CDP模型的核心价值、建模关键技术、滞回曲线优化方法及典型问题排查指南,帮助工程师精准模拟混凝土的拉伸开裂和压缩压碎行为,提升抗震分析效率。文章还提供了实用的工程应用技巧,如快速建模模板和后处理自动化脚本。
【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和
K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。
Frida实战:高效dump Android内存中的so文件与修复技巧
本文详细介绍了使用Frida工具dump Android内存中已解密so文件的实战技巧。针对加固应用静态分析失效的痛点,文章提供了从环境搭建、使用frida_dump脚本自动化抓取内存数据,到利用SoFixer工具修复ELF文件结构的完整流程,帮助逆向分析人员高效获取可分析的so文件。
chromium通信系统-ipcz系统(二)-ipcz系统代码实现-同Node通信
在chromium通信系统-mojo系统(一)-ipcz系统基本概念一文中我们介绍了ipcz的基本概念。 本章我们来通过代码分析它的实现。 handle系统 为了不对上层api暴露太多细节,实现解耦,也方便于传输,ipcz系统使用handle表示一个对象,handle类似于文件描述符,用IpczHandle类型表示ipcz系统内的一个对象。一个可以用IpczHandle 句柄表示的对象必须是APIObject子类。APIObject数据结构如下 class APIObject : public RefCou
排序算法深度笔记(下):非比较类排序的线性突破与工程边界
排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)
抖音小程序:解决获取手机号报错 getPhoneNumber:fail auth deny,登录注册时需要获取用户手机号,getPhoneNumber一直提示错误(Uniapp抖音小程序报错也能解决)
抖音字节小程序获取手机号报错getPhoneNumber:fail auth deny,抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth ,抖音小程序获取手机号始终返回拒绝,抖音小程序获取手机号,已经过了试运营期但依旧报错如何解决,调用 tt.getPhoneNumber 接口报错,登录注册时需要获取用户手机号,getPhoneNumber一直提示getPhoneNumber:fail auth deny,此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;unia
算法日常・每日刷题--<动态规划>42
本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
C语言程序设计题|有序数组插入数字冒泡排序
题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
【算法拾光】模拟|外观数列 + 数青蛙
本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路
2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。
牛客周赛165C题(前后缀性质,递推,排序,枚举)
题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)
【数据结构-3】算法美学之降复杂度
在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。
算法61,判定是否为字符重排
两字符串能互为重排 ⇔。
算法日常・每日刷题--<动态规划>32
给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。
算法札记:几何分布在算法题UVA1262的运用
集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。
考拉兹猜想 - 7
本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。
SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对
申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。
贪心题目:可以到达的最远建筑
为了到达尽可能远的建筑物,在将砖块替换成梯子时,应将高度差最大位置的砖块替换成梯子,此时剩余的砖块数量最多,如果将高度差较小位置的砖块替换成梯子,则剩余的砖块数量较少,能到达的最远建筑物下标不可能更大。开始向后面的建筑物移动,移动过程中维护优先队列存储正高度差,优先队列的队首元素是最大元素,每次遇到正高度差时优先考虑使用砖块,如果砖块数量不够则使用梯子替换最大高度差位置的砖块,直到砖块和梯子都使用完毕时,到达的建筑物即为最远建筑物。如果以最佳方式使用给定的梯子和砖块,返回可以到达的最远建筑物的下标。
从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战
以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。
1687



被折叠的 条评论
为什么被折叠?



