UNIX网络编程学习(五)---UDP编程

5 篇文章 0 订阅
5 篇文章 0 订阅

UDP相比TCP是无连接的。

它收发数据是通过recvfrom和sendto两个函数。

它们的原型如下:

    ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

    ssize_t sendto(int sockfd, void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen)。

UDP客户端和服务端通信过程引用书中图如下:

    

相比于TCP,UDP客户端在socket之后就开始发送数据;UDP服务端在bind之后就开始接收数据。

UDP客户端发送数据时,有两点要考虑:

    1.发送数据过快。

    2.服务器进程未运行。

(1).发送数据过快

        由于UDP不必等待来自服务端的应答,因此它可以一直发送数据。这样就很容易将服务端淹没,行别地,如果客户端发送数据的带宽大于服务端的带宽,就更容易出现这样的现象。事实上,服务端在接收到来自客户端的数据时,是暂时先把数据存在一个缓冲区中,然后从其中一个一个地拿数据。如果服务端的缓冲区满了,那么后来的数据报就会被丢弃,这就造成了数据的丢失。UDP发送数据过快可以通过限制客户端的发送数据包的数量,或扩大服务端的缓存容量来解决。

(2).发送的服务端不存在

   当UDP发送的服务端不存在时,会有一个端口不可达的错误。但UDP并不会收到这样的错误。如果UDP和服务器端进行了   connect,那么这个错误就会返回给UDP客户端。此外,当UDP客户端进行了connect操作后,它之后发送的数据也就确定了发送的对象(如果一台机器上有多个IP,那么未进行connect的UDP会发到这几个IP中的一个)。

 

connect的UDP和非connec的UDP通信过程比较(以发送两个数据报为例):

非connect:

    1.连接套接字。

    2.输出第一个数据报。

    3.断开套接字。

    4.连接套接字。

    5.输出第二个数据报。

    6.断开套接字。

 

connect:

    1.连接套接字。

    2.输出第一个数据报。

    3.输出第二个数据报。

比较可以看出当要多次向一个服务端发送数据时,UDP还是连接要高效些。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值