-
手动直连方式:ysend [-r] ./文件或文件夹 目标ip [go Number]
- [-r] 为多文件发送参数,省略为单文件
- [go Number] 并发数
-
自动直连方式:
- ysend -c routeIp [-r]./文件或文件夹 目标ip [go Number]
-
直连探测,目前已使用UDP实现(但还有一些问题,比如相同网段内 yrecv无法收到ydect发送的udp数据包,可能原因还未找到)
-
自动直连探测,实现计划是:发送TCP请求到route以获取所有连接上route的yrecv机器。route收到TCP请求数据包后应当返回yrecvList
-
文件传输相关端口
- 单文件监听端口 8848
- 多文件监听端口 8849
- 探测报文监听端口 8850
-
直连方式: 已实现
-
自动直连方式
- 溪流:
- 大海:
自动直连方式:为解决不在同一局域网文件同步问题,准备实现2种方案
- 溪流:route可以直接连通yrecv。
- 大海:route无法直接连通yrecv(需要yrecv主动连route)
首先如果route可以直接连通yrecv(通过net.Dial),那么选择溪流。否则通过大海。
ysend的每个TCP连接,route对应yrecv的每个TCP连接(ysend=>route=>yrecv)
1.首先ysend发送同步信息(主要为开启的并发数(固定为cpu核心数*2))到route。
2.route将ysend同步信息发送至yrecv(通过yrecv与route的连接)
3.yrecv收到ysend的同步信息后,根据要开启的并发数假设为cN.
4.yrecv与route再次新增cN个连接,用于接收ysend的数据.
5.route收到请求连接yConn后,需将其保存下来,假设全部的yConn为yConnList。
6.当route准备完毕后,发送信息给ysend可以并发发送数据了。
7.ysend收到route的ok信息后,开始并发发送。
8.route接到数据信息后,从yConnList中取出一条yConn,进行转发
9.结束
-
ysend向yrout发送YDECT_MSG命令获取所有yrcv服务列表(YList)
- 根据需要目标名称dn遍历YList,获取对应的yrecv注册信息(yrcvInfo)
- 如果yrcvInfo存在
- 计算goNum(goNum=(本机core*2 + yrecvInfo.Cpu)/2)),也就是需要开启的任务数
- 如果yrcvInfo不存在
- 结束当前发送任务
-
ysend读取目录文件数据
-
发送目录数据
- ysend向yrout发起Reuest{cmd:YSEND_DIR_DATA_SYNC, data:"name:yms"} => d1,
- yrout接到ysend的数据d1后,根据d1.data.name去YrecvRegInfo找到对应的BaseConn=>ybc
- yrout向ybc连接发送{cmd: YSEND_DIR_DATA_SYNC, data:"no"} => d2
- yrecv收到yrout数据d2后, 立即掉函数doHandlerRequest(传入当前连接-与yrout的连接)
- doTransfer => =>
- ysend继续发送数据 d
- yrout继续网ybc连接发送数据 d
- ysend向yrout发送目录数据(dirData)
- yrout收到ysend的dirData后,发送至ybc连接
- yrout等待读取yrecv的第一次响应数据,收到后转发给ysend
- yrout继续循环等待yrecv传输信息
- 循环接收yrecv的目录建立信息,收到后转发给ysend
- 当遇到resp.Ok=true的时候结束
- 发送Response{Ok=true}到ysend
- 结束当前数据转发
-
发送文件
- ysend向yrout发起Reuest{cmd:YSEND_MUL_FILE_SYNC data:"name:yms"} => d1,
- yrout接到ysend的数据d1后,根据d1.data.name去YrecvRegInfo找到对应的BaseConn=>ybc
- yrout向ybc连接发送{cmd: YSEND_MUL_FILE_SYNC, data:"core:3"} => d2
- yrecv收到yrout数据d2后,开始向yrout主动建立d2.core个连接,请求Request{cmd: YRECV_REQUEST_ESTABLISH_CONN, data:"name:yms,type:mul",other:""}
- yrout收到连接后,将连接推入chan中
- 当yrecv的core连接全部建立完毕后,通知ysend开始发送
- ysend收到后,先向yrout发Request{cmd: YSEND_MUL_FILE_SYNC2, data:"name:yms",other:""}
- 开始 doTransfer
-
结束
-