linux网络编程3
24.9.19学习目录
- 一.UDP(续)
- 1.UDP编程
- 2.注意点
- 2.TFTP
- TFTP通信过程
- TFTP协议分析
一.UDP(续)
1.UDP编程
(1)sendto函数发送数据
向to结构体指针中指定的ip,发送UDP数据;
通过to和addrlen确定目的地址;
可以发送长度为0的数据
ssize_t sendto(int sockfd,const void *buf,size_t nbytes,int flags,const struct sockaddr *to,socklen_t addrlen);
sockfd:套接字
buf:发送数据缓冲区
nbytes:发送数据缓冲区的大小
flags:一般为0
to:指向目的主机地址结构体的指针
addrlen:to所指向内容的长度
(2)bind函数绑定
bind函数将socket套接字与本地协议的地址进行绑定
int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
sockfd:socket套接字
myaddr:指定特定协议的地址结构指针
addrlen:该地址结构的长度
(3)recvfrom函数接收函数
将源地址信息保存在from指向的结构中
ssize_t recvfrom(int sockfd.void *buf,size_t nbytes,int flags,struct sockaddr *from,socklen_t *addrlen);
sockfd:套接字
buf:接收数据缓冲区
nbytes:接收数据缓冲区的大小
flags:套接字标志(常为0)
from:源地址结构体指针,用来保存数据的来源
addrlen:from所指内容的长度
注意:
from和addrlen可以为NULL,表示不保存数据来源
2.注意点
(1)客户端
在客户端的代码中,指设置了目的IP、目的端口,而客户端的IP和端口都是linux系统底层自动给客户端分配的;
分配端口的方法时随机分配;
(2)服务端
因为服务器需要固定本地端口,所以需要进行bind;
服务器也可以主动给客户端发送数据;
客户端可以进行bind,但一般不必要
2.TFTP
TFTP为简单文件传送协议;
其是基于UDP协议实现的,因此在应用层中想要使用TFTP,那么传输层就一定要是UDP;
和UDP一样是不进行用户有效认证;
数据传输模式:
- octet:二进制模式
- netascii:文本模式
- mail:已经不再支持
TFTP通信过程
- 服务器等待客户端的请求
- 服务器接收到请求后,使用临时端口与客户端进行通信
- 发送长度为512Byte的数据,数据包的编号从1开始增加
- 每个数据包都要得到ACK的确认,当出现超时时,则重新发送最近一次的数据包
- 当数据包是大小小于512Byte时表示传输结束
TFTP协议分析
读写请求中操作码为1或2,代表为读或写,即上传或下传;
以上的0代表的是“\0”;