# transm

一个简易的使用服务端(`tss`)作为中转中心，间接在两个（多）客户端(`tsc`)之间传输文件的工具。

平台支持：`Windows`、`Linux`、`MacOS`、`Termux`、`iPhone iSh`及理论上其他任意支持`c++17`标准编译器的平台。

低版本编译器，可选择`boost`+`c++11`标准组合。

**注**：使用安装包的用户，如果想变更安装位置的话，请先卸载旧版本（原位置更新新版不用）。

# 一、简要介绍

| 主要功能序号 | 简介                                                         |
| ------------ | ------------------------------------------------------------ |
| 1            | A端提交文件列表到服务端，B端可以从服务端查阅有哪些客户端提交的哪些任务，自行选择下载。 |
| 2            | A端可以提交一个下载任务文件给B端，B端会自动下载列表中的文件（可用作更新远端文件）。 |

- `tss`和`tsc`均为命令行端程序，无GUI。

- `tsc`从`tss`下载文件的时候，如果本地有已存在则会被**覆盖**（注意）。

- 介绍所指的客户端`A`、`B`是泛指，实际服务端程序支持任意个客户端相互之间**同时连接**和**同时传输**文件，吞吐瓶颈在服务端主机网络上。

## 一些特点（基于最新版本）

- 通配符传输。
- 终端自动文件补全。
- 自动更新远程文件。
- 多客户端可以同时互相收发文件。
- 自动检测对方掉线。
- 服务端自我安全防御（若部署到云端防止常规攻击）。
- 广泛的平台支持。
- 服务端仅转发数据，不存储数据。
- 极小的、单个文件。
- 干净，不会在客户机环境到处遗留临时文件。
- 运行时无其他三方二进制库依赖。
- 临时公网传输，无需使用三方需要登陆软件。
- `Linux`到`Linux`文件传输保留原权限。

# 二、使用说明

## 1.程序启动

- 对于服务端程序`tss`，绑定默认绑定`0.0.0.0`的`9898`端口，如果需要修改端口，使用参数启动，示例：`tss 9898`。
- 对于客户端程序`tsc`，请使用`tsc --help`查看使用方式。
- `Up`指令后面的文件名路径，如果是非全路径（即相对路径），程序会自动拼接到当前`tsc`工作目录（如`Up dira/test.txt`也是可以的）。

## 2.命令使用（截图可能过时，但使用方式大致如此）

### 2.1 客户端 tsc 简介

![tsc](https://www.sinxmiao.cn/taynpg/transm/raw/branch/main/img/tsc_use.png)

### 2.2 功能一简介

![func1](https://www.sinxmiao.cn/taynpg/transm/raw/branch/main/img/func1.png)

### 2.3 功能二简介

![func2](https://www.sinxmiao.cn/taynpg/transm/raw/branch/main/img/func2.png)

### 3.1 Get功能

`v1.2.3`版本起（含），当某个客户端的列表文件数量过多时，只展示部分（会显示总数量）。

### 3.2 Up功能

`v1.2.3`版本起（含），`up`后路径支持`?`和`*`通配符：

```shell
up /home/zhang/png/cloud*.png|/home/zhang/download/202?-*.exe
```

### 3.3 Down功能

`v1.2.3`版本起（含），支持传入下载位置（默认命令所在目录）：

```shell
down 1 dira/dirb
down 1 ../download
down 2 /home/zhang/document
```

### 3.4 Update功能

命令格式为：`Update 客户端标号 列表文件`

`Update`的提交的列表文件格式为`txt`，内容为每一行格式是`A|B`，其中`A`为提交端的文件路径，`B`为要放到下载端的哪个目录 **（下载端必须存在这个目录，否则下载端拒绝自动下载）**。

示例执行:`Update 1 task.txt`，其中`task.txt`内容示例如下：

```txt
D:/文件/abc.zip|/home/zhangsan/downlaod
D:/截图/Ni.jpg|/home/zhangsan/picture
```

#### update新增（一）

`v1.2.1`版本起（含），`task.txt`支持以下变量：

- ${HOME}，用户目录（发送端接收端均支持）。
- ${CURRENT}，任务文件所在目录（即`task.txt`所在目录，该变量仅支持发送端，也就是`|`左侧，因为接收端没有任务文件所在路径）

```txt
${HOME}/截图/Ni.jpg|${HOME}/dira
${CURRENT}/xxx.zip|D:\
```

**NOTE**: `列表文件`的格式为`UTF-8`编码。

# 注意

- 如果两个`tsc`客户端在同一台机器上同时收发同一个文件将导致文件丢失损坏（如果收发操作的是同一个文件）。

# 编译

当前项目支持`xmake`和`cmake`构建工具。

```shell
git clone --recursive https://www.sinxmiao.cn/taynpg/transm
```

## 1.常规编译

xmake：`xmake`。

cmake：`cmake -Bbuild -DCMAKE_BUILD_TYPE=Release`、`cmake --build build --config Release`。

## 2.XP系统编译

### 前提

- 支持`XP`的`msvc`编译器不支持新`C++语法标准`，故使用`mingw32`编译器。
- 支持`xp`的`mingw32`编译器的`c++17`标准的`filesystem`模块还是实验性质且有编译`BUG`，故使用`boost-filesystem`。
- 需要一个最低`3.16`版本的`cmake`。

### 编译

请参照：`xp_build.bat`。


# XP用户阅

- `xp`系统下，安装后（或者添加环境变量后），如果时第一次使用请先执行`ansicon -i`以支持彩色显示，后续则不用再次执行（如果没有卸载过或变更安装位置）。
- 使用安装包的用户，如果想变更安装位置的话，请先卸载旧版本（原位置更新新版不用）。
- 如果安装位置有变动或者单纯卸载`transm`，请先执行`ansicon -u`再卸载。