tftp
TFTP
模块
TFTP
模块摘要
普通的FTP。
描述
这是以下IETF标准的完整实现:
- RFC 1350,TFTP协议(修订版2)
- RFC 2347,TFTP选项扩展
- RFC 2348,TFTP块大小选项
- RFC 2349,TFTP超时间隔和传输大小选项
唯一没有实现的功能是“netascii”传输模式。
start/1
函数启动守护进程侦听端口上的UDP数据包。当它收到读取或写入的请求时,会产生一个处理传输的临时服务器进程。
在客户端,功能read_file/3
和write_file/3
生成临时客户端进程,与TFTP守护进程建立联系,并执行文件传输。
tftp
使用回调模块处理文件传输。提供了两个这样的回调模块,tftp_binary
和tftp_file
.见read_file/3
和write_file/3
关于细节。您还可以实现自己的回调模块,请参见CALLBACK FUNCTIONS
.使用选项注册用户提供的回调模块。callback
,见DATA TYPES
...
TFTP服务器服务启动/停止
TFTP服务器可以配置为在启动Inets
应用程序时静态启动。或者,它可以Inets
通过调用Inets
应用程序API 动态启动(当已经启动时),inets:start(tftpd, ServiceConfig)
或者inets:start(tftpd, ServiceConfig, How)
查看inets(3)
详细信息。在ServiceConfig
为TFTP在描述DATA TYPES
部分。
TFTP服务器可以停止使用inets:stop(tftpd, Pid)
,inets(3)
详情请参阅。
TPFT客户端具有这样的临时性质,它不会作为Inets
服务框架中的服务来处理。
数据类型
ServiceConfig = Options
Options = [option()]
大多数选项对于客户端和服务器端都是常见的,但其中一些选项略有不同。可得option()
s如下:
{debug, Level}
Level = none | error | warning | brief | normal | verbose | all
控制调试打印输出的级别。默认是none
。
{host, Host}
Host = hostname()
,参见inet(3)
。
TFTP守护程序所在主机的名称或IP地址。该选项仅供客户端使用。
{port, Port}
Port = int()
守护进程侦听的TFTP端口。默认值是标准化的数字69.在服务器端,有时可以将其设置为0,这意味着守护进程只是选择一个空闲端口(哪一个是由函数返回的info/1
)。
如果套接字已连接,{udp, [{fd, integer()}]}
则可以使用选项将打开的文件描述符传递给gen_udp
。这可以通过使用指定预配置文件描述符编号的命令行参数来自动完成。例如,如果端口是69并且打开文件描述符22 setuid_socket_wrap
,则命令行参数“-tftpd_69 22”触发使用预配置文件描述符22而不是打开端口69. UDP选项{udp, [{fd, 22}]}
被自动添加。查看init:get_argument/
关于命令行参数和gen_udp:open/2
关于UDP选项的信息。
{port_policy, Policy}
Policy = random | Port | {range, MinPort, MaxPort}
Port = MinPort = MaxPort = int()
用于选择文件传输期间服务器/客户端使用的临时端口的策略。默认是random
,这是标准化的政策。有了这个政策,就可以使用随机空闲端口。如果协议通过防火墙,则单个端口或一系列端口可能很有用。
{udp, Options}
Options = [Opt]
,参见gen_udp:open/2
。
{use_tsize, Bool}
Bool = bool()
自动使用选项的标志tsize
。使用此设置true
,write_file/3
客户端将确定文件大小并将其作为标准化tsize
选项发送到服务器。一个read_file/3
客户端通过发送零只获取来自服务器的文件大小tsize
。
{max_tsize, MaxTsize}
MaxTsize = int() | infinity
最大文件大小的阈值(以字节为单位)。如果超出限制,传输将中止。默认是infinity
。
{max_conn, MaxConn}
MaxConn = int() | infinity
最大活动连接数的阈值。如果超出限制,守护程序将拒绝新连接的设置。默认是infinity
。
{TftpKey, TftpVal}
TftpKey = string()
TftpVal = string()
TFTP选项的名称和值。
{reject, Feature}
Feature = Mode | TftpKey
Mode = read | write
TftpKey = string()
控制拒绝哪些功能。这对于服务器最为有用,因为它可以限制某些TFTP选项或读/写访问的使用。
{callback, {RegExp, Module, State}}
RegExp = string()
Module = atom()
State = term()
注册一个回调模块。当要传输文件时,其本地文件名将与注册回调的正则表达式匹配。在传输过程中使用第一个匹配回调。见read_file/3
和write_file/3
。
回调模块必须实现该tftp
行为,请参阅CALLBACK FUNCTIONS
。
{logger, Module}
Module = module()()
回叫模块,用于自定义错误,警告和信息消息的记录。回调模块必须实现该tftp_logger
行为,请参阅LOGGER FUNCTIONS
。默认模块是tftp_logger
。
{max_retries, MaxRetries}
MaxRetries = int()
最大重试次数的阈值。默认情况下,当超时到期时,服务器/客户端尝试重新发送消息最多五次。
出口
change_config(daemons, Options) -> [{Pid, Result}]
类型
更改所有TFTP守护进程的配置。
change_config(servers, Options) -> [{Pid, Result}]
类型
更改所有TFTP服务器进程的配置。
change_config(Pid, Options) -> Result
类型
更改TFTP守护进程、服务器或客户端进程的配置。
info(daemons) -> [{Pid, Options}]
类型
返回有关所有TFTP守护进程的信息。
info(servers) -> [{Pid, Options}]
类型
返回有关所有TFTP服务器进程的信息。
info(Pid) -> {ok, Options} | {error, Reason}
类型
返回有关TFTP守护进程、服务器或客户端进程的信息。
read_file(RemoteFilename, LocalFilename, Options) -> {ok, LastCallbackState} | {error, Reason}
类型
从TFTP服务器读取(虚拟)文件RemoteFilename
。
如果LocalFilename
是原子binary
,tftp_binary
则用作回调模块。它连接所有传输的块并将它们作为一个单一的二进制返回LastCallbackState
。
如果LocalFilename
是字符串并且没有注册回调模块,tftp_file
则用作回调模块。它将每个传输的块写入到名为的文件中,LocalFilename
并返回传入的字节数LastCallbackState
。
如果LocalFilename
是一个字符串并且存在已注册的回调模块,LocalFilename
则会针对这些回调模块的正则表达式进行测试,并使用与第一个匹配对应的回调模块,或者如果找不到匹配的正则表达式则返回错误元组。
start(Options) -> {ok, Pid} | {error, Reason}
类型
开始守护进程侦听端口上的UDP数据包。当它接收到读或写请求时,它会产生一个处理(虚拟)文件实际传输的临时服务器进程。
write_file(RemoteFilename, LocalFilename, Options) -> {ok, LastCallbackState} | {error, Reason}
类型
将(虚拟)文件写入RemoteFilename
TFTP服务器。
如果LocalFilename
是二进制,tftp_binary
用作回调模块。二进制文件是一个块一个块地传输的,并且在LastCallbackState
...
如果LocalFilename
是一个字符串,没有注册的回调模块,tftp_file
用作回调模块。它读取名为LocalFilename
块并返回在LastCallbackState
...
如果LocalFilename
是一个字符串,并且有注册的回调模块,LocalFilename
根据这些方法的regexp进行测试,并使用对应于第一次匹配的回调模块,如果没有找到匹配的regexp,则返回错误元组。
回调函数
阿tftp
回调模块将作为tftp
行为并导出以下中列出的函数。
在服务器端,回调交互以调用open/5
具有注册的初始回调状态。open/5
将打开%28虚拟%29文件。然后任一个函数read/1
或write/2
被重复调用,每个传输块一次。在每个函数调用中,都会获得从上一次调用返回的状态。当遇到最后一个块时,函数read/1
或write/2
将关闭%28虚拟%29文件并返回其最后一个状态。功能abort/3
仅在错误情况下使用。功能prepare/5
不在服务器端使用。
在客户端,回调交互是相同的,但是它的启动和结束有点不同。一开始是打电话给prepare/5
与open/5
拿着。prepare/5
将验证用户建议的TFTP选项,并返回其接受的子集。然后将选项发送到服务器,服务器执行相同的TFTP选项协商过程。服务器接受的选项被转发到功能。open/5
在客户端。在客户端,功能open/5
必须接受所有选项为-是或拒绝转让。然后,回调交互遵循与服务器端描述的相同模式。中遇到最后一个块时read/1
或write/2
,则将返回的状态转发给用户,并从read_file
/3或write_file/3
...
如果在TFTP服务器%29中执行文件访问的回调%28比双TFTP超时%29花费的时间太长,则服务器中止连接并向客户端发送错误答复。这意味着服务器比以前更快地释放附加到连接上的资源。服务器只是假定客户机已经放弃了。
如果tfttp服务器在已与客户端有活动连接时收到来自同一客户端%28同一主机和端口%29的另一个请求,则如果请求等于二%28相同的文件名和选项%29,则忽略新请求。这意味着%28新%29客户端将由服务器端上已经在进行的连接提供服务。通过不设置与正在进行的连接并行的另一个连接,服务器消耗的资源会更少。
出口
Module:abort(Code, Text, State) -> ok
类型
在文件传输中止时调用。
回调函数将在中止的文件传输之后清除其使用的资源,例如关闭打开的文件描述符等。如果任何其他回调函数返回错误,则不会调用该函数,因为它们已经清理了必要的资源。但是,如果函数失败%28崩溃%29,则调用该函数。
Module:open(Peer, Access, Filename, Mode, SuggestedOptions, State) -> {ok, AcceptedOptions, NewState} | {error, {Code, Text}}
类型
打开用于读写访问的文件。
在客户端,其中open/5
呼叫之前有一个呼叫prepare/5
,所有选项都必须被接受或拒绝。
在服务器端,其中没有前面的prepare/5
调用时,不能添加任何新选项,但是SuggestedOptions
中的新值可以省略或替换。AcceptedOptions
...
Module:prepare(Peer, Access, Filename, Mode, SuggestedOptions, InitialState) -> {ok, AcceptedOptions, NewState} | {error, {Code, Text}}
类型
准备在客户端打开文件。
没有新的选项可以添加,但是SuggestedOptions
中的新值可以省略或替换。AcceptedOptions
...
然后是呼叫open/4
在执行任何读/写访问之前。AcceptedOptions
发送到服务器,服务器将使用它接受的选项进行答复。然后将这些信息转发给open/4
如SuggestedOptions
...
Module:read(State) -> {more, Bin, NewState} | {last, Bin, FileSize} | {error, {Code, Text}}
类型
从文件中读取一块。
当遇到最后一个文件块时,回调函数将关闭该文件。当遇到错误时,回调函数将在中止的文件传输(例如关闭打开的文件描述符等)之后清除。在这两种情况下,将不再调用任何回调函数。
Module:write(Bin, State) -> {more, NewState} | {last, FileSize} | {error, {Code, Text}}
类型
将块写入文件。
当遇到最后一个文件块时,回调函数将关闭该文件。当遇到错误时,回调函数将在中止的文件传输(例如关闭打开的文件描述符等)之后清除。在这两种情况下,将不再调用任何回调函数。
记录器函数
阿tftp_logger
回调模块将作为tftp_logger
行为和导出下列功能:
出口
Logger:error_msg(Format, Data) -> ok | exit(Reason)
类型
记录错误消息。见error_logger:error_msg/2
关于细节。
Logger:info_msg(Format, Data) -> ok | exit(Reason)
类型
记录一条信息。见error_logger:info_msg/2
关于细节。
Logger:warning_msg(Format, Data) -> ok | exit(Reason)
类型
记录一条警告消息。见error_logger:warning_msg/2
关于细节。