UDP套接字编程

本文介绍了UDP套接字编程的基础知识,包括UDP的特点、典型应用及与TCP的区别。重点讲解了UDP通信中的关键函数recvfrom和sendto,以及如何处理UDP的回射实例和ICMP异步错误。此外,还探讨了UDP的connect函数和客户端接收异步错误的情况,指出UDP协议在流量控制方面的缺失。
摘要由CSDN通过智能技术生成

UDP编程简介

  1. TCP和UDP在传输层区别
    UDP是无连接不可靠的数据报协议。TCP提供面向连接的可靠字节流。

  2. 使用UDP常见应用
    DNS(域名系统),NFS(网络文件系统),SNMP(简单网络管理协议)

典型的UDP的Client和Server

(1)客户端不和服务器建立连接,只是使用sendto给服务器发送数据,必须指定服务器地址作为参数。
(2)服务器不接受来自客户端的连接,而只是使用recvfrom,等待来自客户端的数据达到。recvfrom同时返回
客户端的协议地址,用于服务器给客户端响应。


        UDP Client                         UDP服务器

                                           socket()
                                              |      
                                              |
                                         bind()众所周知端口
                                              |    
                                              |
        socket()                         recvfrom() <---------- 
           |                                  |               |
           |          数据请求                |                |
    --->sendto()  ----------------->    阻塞,直到收到数据       |  
    |      |                                  |               |
    |      |                                  |               |
    |      |                               处理请求            |
    |      |                                  |               |
    |      |                                  |               |
    |      |           数据应答                |               |
    |---recvfrom() <-----------------     sendto() ------------
           |
           |
           |
         close()

重要函数recvfrom和sendto

recvfrom函数:

    #include <sys/socket.h>
    ssize_t recvfrom(int sockfd,void* buff,size_t nbytes,int flags,struct sockaddr* from,socklen_t *addrlen);
    参数:sockfd  : 套接字描述符
          buff    : 用于存放数据的缓冲区
          nbytes  : 缓冲区大小
          flags   : 暂时总设置为0
          from    : 用于存放UDP对端的套接字协议地址(输出参数)
          addrlen : UDP对端的套接字协议地址字节大小(输出参数)

    注意:最后两个参数from和addrlen可以得知该UDP数据是谁发送过来的。
          如果设置from和addrlen为NULL,表示我们忽略对端信息。

    返回值:
        成功返回读取到的字节数,出错返回-1。返回值0是被允许的,不同于TCP中read返回0表示对端已经关闭。

sendto函数:

    #include <sys/socket.h>
    ssize_t sendto(int sockfd,const void* buff,size_t nbytes,int flags,const struct sockaddr* to,socklen_t *addrlen);
    参数:sockfd  : 套接字描述符
          buff    : 要发送的数据内存
          nbytes  : 数据大小
          flags   : 暂时总设置为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值