11月17日笔记网络编程3_UDP套接字编程及广播,组播

1.UDP套接字编程
    UDP传输层的一个协议 面向无连接 数据报的传输层协议
    无连接 不可靠的一种协议

    既然不可靠为什么要用UDP
        1.实时应用
        2.在网络环境比较好的时候 UDP的效率更高。

        可以在应用层保证你的数据可靠

        sendto 
        recvfrom 你要知道谁给你发了消息你才好回信


    练习:
        1.DNS Domain Name syatem域名解析系统

            www.baidu.com  -> server
            server -->   "10.10.1.1"
            如果你没有保存百度的地址
            server -》"unknow"
    
    我们每个套接字有一些行为属性可以设置
        如 每个套接字在内核中 都会有两个缓冲
            send buffer
            racv buffer
        这两个缓冲区的大小是多少?
        能不能改变其大小
(2)套接字的选项
    每个套接字在不同的协议层面上有着不同的行为属性
    有两个函数用于获取设置套接字的选项

    NAME
        getsockopt, setsockopt - get and set options on sockets

    SYNOPSIS
        #include <sys/types.h>          /* See NOTES */
        #include <sys/socket.h>

            获取套接字的行为属性
        int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);

                    sockfd     :套接字的描述符
                    level        :要获取那个选项的“级别”
                                        查表
                    optname :要获取选项的名称(宏)
                    optval     :指向一段空间 用于保存获取到的选项的值
                    optlen     :指向空间的大小 返回值越界
            返回值
                成功返回0
                失败返回-1 同时errno被设置

            设置套接字的行为属性      

        int setsockopt(int sockfd, int level, int optname, const void *optval,

                                                                                                        socklen_t  optlen);

                    sockfd     :套接字的描述符
                    level        :要设置那个选项的“级别”
                                        查表
                    optname :要设置选项的名称(宏)
                    optval     :指向一段空间 指向设置选项的值
                    optlen     :指向空间的大小 返回值越界
            返回值
                成功返回0
                失败返回-1 同时errno被设置


3.广播域与组播(多播)
    (1)广播 boardcast
        a 只有传输层协议时UDP时,才支持广播
            TCP是面向连接 广播是一对多
        b.广播的地址
            子网内的广播地址是主机号全为1
                假设子网掩码 255.255.255.0
                则广播地址   X.X.X.255

            netmask 为 255.255.128.0
            你的IP是192.168.31.3
            子网内的广播地址是 192.168.127.255

            netmask 为 255.255.192.0
            你的IP 192.168.128.33
            子网的广播地址是?192.168.191.255

            netmask 为 255.255.224.0
            你的IP为 192.168.160.9
            子网的广播地址为 192.168.191.255
        
        c.全网广播地址 255.255.255.255
            没有实际意义=》网络风暴=》网络瘫痪
    
    (2)广播编程思路
        看图    (3)组播(多播)
        1.多播只有传输层协议为UDP时候才可以
        2.为什么需要多播?
            如果所有人都使用广播 占用带宽 容易造成网络风暴
            组播是一种折中的方案 只有加入了某个多播组的主机才能收到数据
        3.多播的地址 ipv4 中D类地址
        4.多播的编程思路
            “加入多播组

            struct ip_mreq//为了可以移植性 定义成私有的类型(放到.c)
            {
                struct in_addr imr_multiaddr;//多播的地址(D类地址)
                struct in_addr imr_intreface;//接口(网卡)IP地址
                                        //多播数据实际走那个网卡
            };

            struct ip_mreq mreq;

            mreq.imr_multiaddr.addr = inet_addr("224.10.10.1");
            //下面两行代码二选一
            //mreq.imr_intreface.addr = honl(INADDR_ANY); //所有位全为0 让系统给你选网卡
            //mreq.imr_intreface.addr =inet_addr("0.0.0.0");//所有位全为0 让系统给你选网卡
            setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&mreq, sizeof(mreq));
    
    6.要在支持多播的机子设置好路由(虚拟机可以不用)
        //收到224.0.0.0网段的多播数据 往eth0这个网卡上面发
        route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
        //添加默认网关
        route add default gw 192.168.31.1 dev eth0



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Python Socket服务器,以下是一些基本的学习笔记: 1. 创建Socket服务器 使用Python中的`socket`模块创建Socket服务器,可以使用`socket()`函数来创建一个Socket对象,如下所示: ```python import socket # 创建一个Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 其中,第一个参数`AF_INET`表示使用IPv4地址族,第二个参数`SOCK_STREAM`表示使用TCP协议,如果使用UDP协议,则应该使用`SOCK_DGRAM`。 2. 绑定Socket服务器 在创建Socket对象之后,需要使用`bind()`方法将Socket对象和一个IP地址及端口号绑定在一起,如下所示: ```python # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8888)) ``` 其中,`bind()`方法的参数是一个元组,第一个元素是IP地址,第二个元素是端口号。 3. 监听Socket服务器 在绑定IP地址和端口号之后,需要使用`listen()`方法开始监听Socket服务器,如下所示: ```python # 开始监听 server_socket.listen(5) ``` 其中,`listen()`方法的参数表示最大连接数,即同时可以连接的客户端数量。 4. 接受客户端连接 当有客户端连接到Socket服务器时,需要使用`accept()`方法来接受客户端连接,如下所示: ```python # 接受客户端连接 client_socket, client_address = server_socket.accept() ``` 其中,`accept()`方法返回一个元组,第一个元素是客户端的Socket对象,第二个元素是客户端的IP地址和端口号。 5. 接收和发送数据 客户端连接到Socket服务器之后,就可以进行数据的接收和发送了,使用`recv()`方法接收客户端发送的数据,使用`send()`方法向客户端发送数据,如下所示: ```python # 接收客户端数据 data = client_socket.recv(1024) # 发送服务器数据 client_socket.send(b'Hello, client!') ``` 其中,`recv()`方法的参数表示接收数据的最大字节数,`send()`方法的参数是要发送的数据,需要将其转换为字节串。 6. 关闭Socket服务器 当与客户端的通信完成后,需要使用`close()`方法关闭Socket服务器,如下所示: ```python # 关闭Socket服务器 server_socket.close() ``` 以上是关于Python Socket服务器的一些基本学习笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值