第三十四篇,网络编程UDP通信过程实现和函数接口

udp的通信流程和接口函数
=====================================
   1.通信流程
        udp没有客户端和服务器的概念
        udp有发送端和接收端的概念
        udp发送端:谁先发送信息,谁就是发送端

     发送端
         socket--》bind--》收发信息--》关闭
     接收端
         socket--》bind--》收发信息--》关闭

   2.收发信息
         //发送信息
         ssize_t sendto(int socket,void *message, size_t length,int flags,struct sockaddr *dest_addr,socklen_t dest_len);
               返回值:成功 --》返回发送的字节数
                       失败 --》-1
                 参数:socket --》你创建的udp套接字
                       前面4个参数跟send一模一样
                       dest_addr --》存放对方(你要发送信息过去,需要接收你信息的那个主机)的ip和端口号 
                       dest_len --》地址结构体的长度
         //接收信息
         ssize_t recvfrom(int socket,void *buffer,size_t length,int flags, struct sockaddr *address,socklen_t *address_len);
               返回值:成功 --》返回接收的字节数
                       失败 --》-1
                       注意:recv和recvfrom是不同的
                             第一:recv用于tcp,recvfrom用于udp
                             第二:recv返回0表示对方断开了,并且recv也不再阻塞
                                   recvfrom如果对方退出了,recvfrom照样阻塞,不会返回0

                 参数:前面4个参数跟recv一模一样
                       address --》存放对方的ip和端口号
                       注意:address参数不需要初始化,当某个主机利用udp发送信息过来,recvfrom接收的时候会自动把发送端主机的ip和端口号填充到这个变量中
                       address_len --》地址长度大小,要求是指针

udp广播代码实现
=====================================
   1.ip地址的分类  A  B  C  D四类地址  
        网络号(网段):用来区分不同的局域网
          比如:粤嵌有很多课室,每个课室都是一个小型的局域网,每个局域网的网段(网络号)都是不同的
                咱们课室192.168.22  --》广播专用地址192.168.22.255
                隔壁课室192.168.23  --》广播专用地址192.168.23.255
                隔壁课室192.168.24
                隔壁课室192.168.25  
                
                   
        主机号:用来区分同一个局域网内部,不同的主机
                 咱们课室192.168.22   主机一   192.168.22.30
                                      主机二   192.168.22.31
                10.0.9.5 --》A类
                192.168.22.2 --》C类
     udp组播:发送给局域网中同一个组播组里面的主机
     udp广播:发送给局域网中的所有主机

 

  2.udp广播代码思路及实现
        广播发送端
             创建套接字socket
             绑定bind
             设置套接字的属性为可以广播setsockopt
             发送广播信息sendto(   使用局域网中的广播专用地址) 
        广播接收端
             创建套接字socket
             绑定bind  
             接收广播信息recvfrom
        设置套接字的属性为可以广播
             int on=1;
             setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));


udp组播代码实现(组播是广播的一种特殊形式)
=====================================
        组播发送端
            创建套接字socket
            绑定bind
            设置套接字的属性为可以广播setsockopt
            发送组播信息sendto(   使用组播专用地址(D类地址)) 
        组播接收端
            创建套接字socket
            绑定bind  
            加入到某个组播组里面
            接收组播信息recvfrom
        注意:加入到组播组代码如下
            struct ip_mreq mreq;  //定义结构体变量保存组播组信息
            bzero(&mreq, sizeof(mreq));
            mreq.imr_multiaddr.s_addr = inet_addr("跟发送端使用的组播地址一致"); //  D类地址  
            mreq.imr_interface.s_addr = htonl(INADDR_ANY);  // 必须用这个宏定义
            setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq)); //把这个主机添加到组播组里面


对比tcp和udp(理论知识,面试的时候很喜欢问)
=====================================
   1.tcp和udp的不同
        第一个:tcp是面向连接的,可靠的通信方式
                udp是无连接,不可靠的通信方式
        面向连接(三次握手):tcp通信过程中客户端需要主动调用connect函数去连接服务器
                           tcp服务器需要主动调用accept去接受客户端的连接请求,它们才能通信
                           udp在通信的时候,是没有这个过程
        可靠:tcp协议的底层支持错误重传(会校验数据),不容易丢失数据包(网络拥堵的情况下)
        不可靠:udp不支持错误重传,网络拥堵的时候很容易丢失数据包

   2.tcp和udp的适用场合
        tcp适合通信要求高的场合,比如:传输账号和密码,传输重要文件
        udp适合通信要求不高的场合,比如:udp用于视频点播

   3.三次握手和四次握手
        三次握手:发生在tcp客户端调用connect去连接服务器的时候
        四次握手:发生在tcp客户端跟服务器断开连接的时候


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肖爱Kun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值