
croc 默认公共中继连接失败后如何重新选择健康中继【免费下载链接】crocEasily and securely send things from one computer to another :crocodile: :package:项目地址: https://gitcode.com/GitHub_Trending/cr/croc用croc在两台电脑之间传文件时默认走的是官方内置的公共中继池。中继连接失败的典型表现是发送端报出relay connection failed或在选择阶段直接报no public relay available没有任何一个中继完成 ping/pong 探测。croc的设计是自动代码发送端会并发探测中继池、把第一个健康的中继写入本地缓存连接失败时自动清掉缓存下一次发送重新测量。本文说明这套机制的判断依据以及在缓存仍指向不可用中继时如何手动触发重新选择。公共中继是如何被选中并缓存的公共中继池的四个地址硬编码在 publicrelay.go 中1.getcroc.com:9009、2.getcroc.com:9009、3.getcroc.com:9009、4.getcroc.com:9009。注意 README.md 的 “Custom Code Phrase” 一节写的是 ordered three-relay pool与当前源码的四地址池不一致地址以源码为准。发送侧的行为取决于你用的是自动生成的代码还是自定义代码cli.go自动生成代码croc send file且不指定--code发送端对池中每个中继并发发起一次完整的 croc ping/pong 探测单个探测超时为 1 秒ProbeTimeout第一个成功完成的探测定胜其余探测随即取消。胜出的地址写入配置目录下的best-relay文件见 getBestRelayCacheFile后续发送直接复用缓存不再探测。自定义代码croc send --code [code-phrase] [file]代码的 SHA-256 摘要对池中地址数取模直接映射到某个中继不探测、不回退。如果恰好映射到的那个中继不可用发送端不会自动换到其他中继。接收端永远按代码映射到的中继连接不做重新选择。连接失败时先看哪几项--debug会输出中继选择的关键日志是判断“选错中继还是中继全挂”的主要依据。在发送端带--debug运行croc --debug send [filename]文档中出现的日志均为 debug 级别输出示例实际值随运行环境变化public relay 2 (3.getcroc.com:9009) won probe race in 412.3ms # 文档示例探测竞速胜出 using cached public relay 1 (2.getcroc.com:9009) from /home/you/.config/croc/best-relay # 文档示例命中缓存按日志区分三种情况出现using cached public relay随后报relay connection failed: could not connect to ...—— 缓存的中继当前不可用见下一节的重新选择。出现won probe race说明有一个中继在 1 秒内通过了 ping/pong如果之后仍然连接失败问题在后续的数据通道不在选择阶段。直接报no public relay available见 publicrelay.go—— 整个池在探测窗口内都没有健康成员只能等待恢复或改用自建中继。另外relay connection failed这个错误类型只在自动生成的公共代码场景下才会触发清缓存。如果你用的是自定义代码即便中继连接失败缓存也不会被动清除见 clearBestPublicRelayOnSendError。重新选择健康中继的两条路径best-relay缓存文件的位置由 GetConfigDir 决定优先级为环境变量CROC_CONFIG_DIR若设置$XDG_CONFIG_HOME/croc若设置默认~/.config/croc。路径一让 croc 自动清缓存对自动生成的代码发送端在Send返回的错误是ErrRelayConnectionrelay connection failed时会自动删除best-relay文件下一次croc send会重新对全池做探测竞速。也就是说失败后再执行一次不带--code的croc send就是重新测量不需要任何额外参数。路径二手动删除缓存文件如果自动清理没有生效例如失败发生在非中继连接环节可以直接删除缓存文件强制重新测量rm ~/.config/croc/best-relay如果你的 croc 使用XDG_CONFIG_HOME对应路径是$XDG_CONFIG_HOME/croc/best-relay如果设置了CROC_CONFIG_DIR则是$CROC_CONFIG_DIR/best-relay。该文件只保存一个中继地址字符串删除它不影响其他 croc 配置send.json、receive.json等在同目录下的其他文件不受影响。删除后下一次自动代码发送会重新探测新的胜出地址会重新写入该文件。删除后的下一次发送若仍失败说明池中没有可用成员而不是缓存问题。全部公共中继都不可用时的替代路径当探测竞速结果为no public relay available时文档支持的替代是自建中继并显式指定这会完全绕过公共路由规则# 在另一台机器上启动自建中继默认使用 TCP 9009-9013 croc relay# 发送端指定自建中继 croc --relay myrelay.example.com:9009 send [filename]如果自建中继设置了密码接收端需要带上同一个密码croc --pass YOURPASSWORD --relay myrelay.example.com:9009--relay或环境变量CROC_RELAY、--ip以及本地传输都会绕过公共中继池的探测和缓存逻辑代码也不再参与中继映射。这条路径适用于公共池整体不可用、或网络只能访问自己可控服务器的场景。限制与说明重新测量只发生在发送端且使用自动生成代码的发送流程接收端和自定义代码不会触发重新选择自定义代码映射到故障中继时没有自动回退需要换用--relay或重新生成代码。缓存命中时不会做任何连通性检查直接使用缓存地址因此“上次成功后中继才故障”的窗口期内第一次失败是预期内的失败会自动清除缓存。本文引用的机制均出自 src/publicrelay/publicrelay.go、src/cli/cli.go 与 README.md其中 “three-relay pool” 的表述与当前源码中的四个地址存在文档与实现的出入实际操作时以--debug日志和源码中的地址列表为准。【免费下载链接】crocEasily and securely send things from one computer to another :crocodile: :package:项目地址: https://gitcode.com/GitHub_Trending/cr/croc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考