UDP和本地套接字

本文深入探讨了TCP和UDP两种网络通信协议的特性。TCP面向连接,提供可靠的数据传输,适用于大数据传输和文件传输;而UDP则无连接,数据传输速度快,适合实时通信如游戏和视频会议。文章还详细讲解了两种协议的实现方式和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP通信和UDP通信各自的优缺点:

TCP:面向连接的,可靠的数据包传输。
对于不稳定的网络层,采取完全弥补的通信方式。丢包重传。
优点:稳定。
数据流量稳定,传输速度稳定,顺序。
缺点:传输速度慢。效率低。系统资源开销大。
使用场景:数据的完整性要求较高,不追求效率。大数据传输,文件传输。

UDP:无连接的,不可靠的数据报传递。
对于不稳定的网络层,采取完全不弥补的通信方式。默认还原网络状况。
优点:传输速度快,效率高,开销小
缺点:不稳定。
数据流量。速度,顺序。
使用场景:对时效性要求较高场合。稳定性其次。
游戏,视频会议,视频电话。
应用层数据校验协议,弥补udp的不足。

UDP实现的C/S模型

accept() ---- connect() —被舍弃
recv()/send()只能用于tcp替代read,write
server:
lfd = socket(AF_INET,SOCK_DGRAM,0);
—报式协议。
bind();
listen(); — 可有可无
while(1){
read —被替换----recvfrom();—涵盖accept传出地址结构的作用
write----被替换----sendto();
}
close();
client:
cfd = socket();
sendto();
recvfrom();
写到屏幕
close();

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:传出参数。地址结构。
addrlen:传入传出参数。
返回值:成功接收数据字节数,失败:-1   0:对端关闭
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:传出参数。目标地址结构。
addrlen:地址结构长度
返回值:成功写出字节数据

代码实现
server

clie_addr_len = sizeof(clie_addr);
n = recvfrom(sockfd,buf,BUFSIZ,0,(struct sockaddr *)&clie_addr,&clie_addr_len);	接收数据
...
n = sendto(sockfd,buf,n,0,(struct sockaddr *)&clie_addr,sizeof(clie_addr));   写出数据

在这里插入图片描述
client
在这里插入图片描述
在这里插入图片描述

本地套接字

IPC:
pipe,fifo,mmap,signal,本地套(domain)
对比网络编程,注意以下几点:
1.socket();domain:AF_UNIX/AF_LOCAL
type:SOCK_STREAM/SOCK_DGRAM都可以
2.bind();地址结构:sockaddr_in -> sockaddr_un

struct sockaddr_un serv_addr;
serv_addr.sunfamily = AF_UNIX;
strcpy(serv_addr.sun_path,"serv.socket");

len = offsetof(struct sockaddr_un,sun_path)+strlen("serv.socket");
bind(fd,(struct sockaddr *)&serv_addr,len);

3.bind函数调用成功汇创将一个socket。因此为保证bind成功,通常在bind之前,可以使用unlink(“serv.socket”)
4.客户端不能依赖隐式绑定,并且在通信过程建立过程中,创建且初始化两个地址结构。

代码实现
server

lfd = socket(AF_UNIX,SOCK_STREAM,0);
struct sockaddr_un serv_addr;
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,"serv_sock");
len = offsetof(serv_addr,sun_path)+strlen("serv_sock");
unlink("serv_sock");
bind(sockfd,(struct sockaddr *)serv_addr,len);
listen(lfd,128);
cfd = accept(lfd,()&clie_addr,(socket_t *)&clie_len);

client

lfd = socket(AF_UNIX,SOCK_STREAM,0);
struct sockaddr_un clie_addr;
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,"clie_sock");
len = offsetof(clie_addr,sun_path)+strlen("clie_sock");
unlink("clie_sock");
bind(sockfd,(struct sockaddr *)clie_addr,len);

struct sockaddr_un serv_addr;
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,"serv_sock");
len = offsetof(serv_addr,sun_path)+strlen("serv_sock");
connect(lfd,()&serv_addr,len);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值