udp通信
TCP UDP各自优缺点:
TCP:面向连接的,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式。丢包重传。
优点:
稳定
数据流量稳定、速度稳定、顺序
缺点:
传输速度慢、效率低、开销大
使用场景:数据的完整性要求较高,不追求效率
大数据传输、文件传输
UDP:无连接的 不可靠的数据报传输。对于不稳定的网络层,采取完全不弥补的通信方式。默认还原网络状况
优点:
传输速度快、效率高、开销小
缺点:
不稳定
数据流量、速度、顺序
使用场景:对时效性要求较高场合。稳定性其次
游戏、视频会议、视频通话。大公司 --应用层数据校验协议,弥补udp不足
UDP实现的C/S模型:
recv()/send() 只能用于 tcp 通信。替代 read、write
accept() ---connect() ---被舍弃
server:
lfd = socket(AF_INET,STREAM,0);
SOCK_DGRAM--报式协议
bind();
listen(); --可有可无
while(1){
read(cfd,buf,sizeof) --被替代 -- recvfrom()涵盖accept传出地址结构
【udp通信】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:地址结构长度
小--大
write(); --被替代 -- 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
dest_addr: 目标地址结构
addrlen:地址结构长度
返回值:成功 写出数据字节数失败: -1、errno
}
close();
client:
connfd = socket(AF_INET,SOCK_DGREAM,0);
sendto('服务器地址结构’,地址结构大小)
recvfrom()
写到屏幕
close();
//serve#include
#include
#include
#include
#include
#include
#include#define SERV_PORT9527void sys_err(const char* str){
perror(str);
exit(1);
}
int main(){
int lfd = 0;
int ret;
char buf[BUFSIZ],client__IP[1024];
struct sockaddr_inserv_addr,clit_addr;
socklen_t clit_addr_len;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
lfd =socket(AF_INET,SOCK_DGRAM,0);
if(lfd==-1){
sys_err("socket error");
}bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
clit_addr_len = sizeof(clit_addr);
while(1){ret = recvfrom(lfd,buf,sizeof(buf),0,(struct sockaddr*)&clit_addr,&clit_addr_len);
printf("client ip :%s port:%d\n"
,inet_ntop(AF_INET,(void*)&clit_addr.sin_addr.s_addr,client__IP,sizeof(client__IP)),
ntohs(clit_addr.sin_port));
write(STDOUT_FILENO,buf,ret);
for(int i=0;
i
#include
#include
#include#define SERV_PORT9527void sys_err(const char* str){
perror(str);
exit(1);
}
int main(){
int cfd;
char buf[BUFSIZ];
struct sockaddr_in serv_addr;
//服务器地址结构serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr);
cfd = socket(AF_INET,SOCK_DGRAM,0);
if(cfd==-1){
sys_err("socket error");
}
while(1){
fgets(buf,sizeof(buf),stdin);
sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
int ret = recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
write(STDOUT_FILENO,buf,ret);
}
close(cfd);
return 0;
}
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- Docker应用:容器间通信与Mariadb数据库主从复制
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- Android|Android BLE蓝牙连接异常处理
- KubeDL HostNetwork(加速分布式训练通信效率)
- 计算机网络基础TCP\HTTP\HTTPS
- Android|Android Kotlin实现AIDL跨进程通信
- TCP长连接与段链接
- Android|Android USB通信
- TCP组件设计篇(详细设计)