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

本文详细介绍了TCP与UDP通信的优缺点,TCP提供稳定但速度较慢的数据传输,适合大数据和文件传输;而UDP速度快但不稳定,适用于实时应用如游戏和视频通话。此外,还讲解了UDP的C/S模型中recvfrom和sendto函数的使用,以及本地套接字的创建和通信过程,强调了本地套接字在AF_UNIX域下的使用及其与网络套接字的区别。
摘要由CSDN通过智能技术生成
TCP通信和UDP通信各自的优缺点:
  • TCP:面向连接,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式。——丢包重传
    • 优点:
      • 稳定。
        • 数据流量稳定、速度稳定、顺序
    • 缺点:
      • 传输速度慢。效率低。开销大。
    • 使用场景:数据的完整性要求较高,不追求效率。
      • 大数据传输、文件传输
  • UDP:无连接的,不可靠的数据报传递。对于不稳定的网络层,采取完全不弥补的通信方式。默认还原网络状况
    • 优点:
      • 传输速度快。效率高。开销小。
    • 缺点:
      • 不稳定。
        • 数据流量。速度。顺序。
    • 使用场景:对时效性要求较高场合。稳定性其次。
      • 游戏、视频会议、视频电话。     ----应用层数据校验协议,弥补UDP的不足。
UDP实现的C/S模型:
recv()send() 只能用于TCP通信。替代read、write
accpet();----Connect();    ----被舍弃

server:

lfd=socket(AF_INET,SEREAM,0);    SOCK_DGRAM----报式协议。
bind();
listen();    ----可有可无
while(1){
     read(cfd,buf,sizeof)----被替换-----recvfrom()---涵盖accept传出地址结构。
      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:对端关闭。
       小--大
       write();----被替换----sendto()    ----connect
             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   

            }
            close();

client:
    connfd=socket(AF_INET,SOCK_DGRAM,0);
    sendto('服务器的地址结构',地址结构大小)
    recvfrom()
    写到屏幕
    close

本地套接字:
  • IPC:pipe、fifo、mmap、信号、本地套(domain)---CS模型
  • 对比网络编程TCP  C/S模型,注意以下几点:
  • 1.int socket(int domain,int type,int protocol);    参数 domain:AF_INET-->AF_UNIX/AF_LOCAL
    •  type:SOCK_STREAM/SOCK_DGRAM       都可以。
  • 2. 地址结构:socket_in--->sockaddr_un
 
    struct sockaddr_in srv_addr; ---->struct sockaddr_un srv_addr;
    srv_addr.sin_family=AF_INET;  --->srv_addr.sun_familt=AF_UNIX;
    srv_addr.sin_port=htons(8888);      strcpy(srv_addr.sun_path,“srv.socket”)
    srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);      len=offsetof(struct sockaddr_un,sun_path)+strlen("srv.socket");
    bind(fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));   --->bind(fd,(struct sockaddr*)&srv_addr,len);

  • 3.bind()函数调用成功,会创建一个socket。因此为保证bind成功,通常我们在bind之前,可以使用unlink("srv.socket");
  • 4.客户端不能依赖“隐式绑定”。并且应该在通信建立过程中,创建且初始化2个地址结构:
    1.client_addr-->bind()
    2.server_addr-->connect();

对本地套接字和网络套接字:
server:
                                网络套接字                                                                    本地套接字
client:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值