TCP
TCP: 面向连接的,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式。 丢包重传。
优点:稳定。数据流量稳定、速度稳定、顺序
缺点:传输速度慢。相率低。开销大
使用场景:数据的完整型要求较高,不追求效率。大数据传输、文件传输。
UDP
UDP: 无连接的,不可靠的数据报传递。对于不稳定的网络层,采取完全不弥补的通信方式。 默认还原网络状况
优点: 传输速度块。相率高。开销小。
缺点:不稳定。数据流量。速度。顺序。
使用场景:对时效性要求较高场合。稳定性其次。 游戏、视频会议、视频电话。腾讯、华为、阿里 — 应用层数据校验协议,弥补udp的不足。
UDP服务器流程
UDP没有三次握手过程,因此连接建立方不需要connect(),接受方不需要accpet()
下面的recvfrom函数有传出地址结构的作用
server端
fd = socket(AF_INET, STREAM, 0); STREAM 改为 SOCK_DGRAM --- 报式协议。
bind(); 绑定端口 ip
listen(); --- 可有可无
while(1){
//这里不需要accept,那么read函数不知道用哪个cfd,所以直接用recvfrom函数
read(cfd, buf, sizeof) --- 被替换 --- recvfrom() --- 涵盖accept传出地址结构。
小-- 大转换
write();--- 被替换 --- sendto()---- connect
}
close();
client端
connfd = socket(AF_INET, SOCK_DGRAM, 0);
//由于不需要connect函数 但是也需要给要发送的服务器ip地址
sendto(‘服务器的地址结构’, 地址结构大小)
//收到信息
recvfrom()
写到屏幕
close();
recvfrom函数
接收一个数据报并保存源地址
有两种模式,阻塞和非阻塞,可以通过ioctl函数来设置。阻塞模式是一直等待直到有数据到达,非阻塞模式是立即返回
ssize_t recvfrom(int sockfd, void *buf, size_t len,
int flags,struct sockaddr *src_addr, socklen_t *addrlen);
sockfd: 套接字
buf:缓冲区地址
len:缓冲区大小
flags: 0
src_addr:(struct sockaddr *)&addr 传出。 对端地址结构
addrlen:传入传出。
返回值: 成功接收数据字节数。 失败:-1 errn。 0: 对端关闭。
sendto函数
ssize_t sendto(int sockfd, const void *buf, size_t len,
int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
sockfd: 套接字
buf:存储数据的缓冲区
len:数据长度
flags: 0
src_addr:(struct sockaddr *)&addr 传入。 目标地址结构
addrlen:地址结构长度。
返回值:成功写出数据字节数。 失败 -1, errno
总结
对于server:
创建一个udp的socket
socket绑定本地ip和端口
recvfrom对这个socket 获得发来的信息和发送方的地址结构
sendto 对这个socket 获得本地的地址信息并根据对方的地址结构发送数据
对于client
创建一个udp的socket
创建接收方的地址结构
可以绑定socket和接收方的地址结构,也可以不绑
都会在sendto那里隐式绑定,sendto需要指定接收方的地址结构