• windows下IPv6组播(C++、MFC)


     


    Server

    #include <stdio.h>
    #include <Ws2tcpip.h>
    #include <winsock2.h>  
    #pragma comment(lib,"ws2_32.lib")#define PORT  6060   
    #define IP "ff02::2"    
    #define BUF_LEN 256  int main(int argc, char* argv[])
    {
        WSADATA     wsaData;
        WORD wVersionRequested;                   // 版本
        wVersionRequested = MAKEWORD(1, 1);       //版本信息
        WSAStartup(wVersionRequested, &wsaData);  //初始化Windows套接字库
    //使用此结构来指定将套接字连接到的本地或远程端点地址
        struct sockaddr_in6 addr = { AF_INET6, htons(PORT) };
        
        //创建一个UDP套接字
        int l_nServer;
        if ((l_nServer = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
        {
            perror("创建失败");
            return -1;
        }
        bind(l_nServer, (struct sockaddr*)&addr, sizeof(addr));
        //ipv6_mreq结构提供了用于IPv6地址的多播组的信息。
        struct ipv6_mreq group;
        //将接口索引指定为0,则使用默认的多播接口。
        group.ipv6mr_interface = 0;
        //IPv6组播组的地址。
        inet_pton(AF_INET6, IP, &group.ipv6mr_multiaddr);
        //将套接字加入到指定接口上提供的多播组。此选项仅对数据报和原始套接字有效(套接字类>型必须为SOCK_DGRAM或SOCK_RAW)。
        setsockopt(l_nServer, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char*)&group, sizeof(group));
    ​
        int l_naddLen = sizeof(addr);
        int l_nReadLen = 0;
        char msgbuf[BUF_LEN];
        printf("等待接收
    ");
        while (1)
        {
            l_nReadLen = recvfrom(l_nServer, msgbuf, BUF_LEN, 0, (struct sockaddr*)&addr, &l_naddLen);
            if (l_nReadLen < 0)
            {
                perror("接收失败");
                exit(1);
            }
            msgbuf[l_nReadLen] = '';
            printf("%s
    ", msgbuf);
    ​
            strcpy_s(msgbuf, "world");
            int l_nLen = sendto(l_nServer, msgbuf, strlen(msgbuf), 0, (struct sockaddr*)&addr, sizeof(addr));
            if (l_nLen < 0)
            {
                perror("发送失败");
                exit(1);
            }
            printf("Send %s
    ", msgbuf);
        }
       
        return 0;
    }

    Cilect

    #include <stdio.h>
    #include <Ws2tcpip.h>
    #include <winsock2.h>
    #define HELLO_PORT  7905    
    #define HELLO_GROUP "224.0.0.1"    
    #pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[])
    {
        WSADATA     wsaData;
        WORD wVersionRequested;
        wVersionRequested = MAKEWORD(1, 1);
        // Initialize Windows socket library
        WSAStartup(0x0202, &wsaData);
        int l_nCilect;
    ​
        struct sockaddr_in6 addr = { AF_INET6, htons(6060) };
    ​
        /* 创建一个UDP套接字 */
        if ((l_nCilect = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
        {
            perror("创建失败");
            exit(1);
        }
        inet_pton(AF_INET6, "ff02::2", &addr.sin6_addr);
    ​
        char message[128];
        int l_naddLen = sizeof(addr);
        while (1)
        {
            strcpy_s(message, "hello");
            int l_nLen = sendto(l_nCilect, message, strlen(message), 0, (struct sockaddr*)&addr, sizeof(addr));
            if (l_nLen < 0)
            {
                perror("发送失败");
                exit(1);
            }
            printf("Send %s
    ", message);
            Sleep(1000);
            int l_nReadLen = recvfrom(l_nCilect, message, strlen(message), 0, (struct sockaddr*)&addr, &l_naddLen);
            if (l_nReadLen < 0)
            {
                perror("接收失败");
                exit(1);
            }
            message[l_nReadLen] = '';
            printf("%s
    ", message);
    ​
        }
    ​
        return 0;
    }
  • 相关阅读:
    用纯 javascript 提高博客访问量
    大龄程序员交流
    Git 本地仓库操作基本命令
    SoapUI登录测试(2)-- 断言
    SoapUI测试登录
    deleteMany is not a function
    jQuery contextMenu使用
    安装MongoDB -- Windows平台
    TortoiseGit 图标不显示
    C#的自定义滚动条
  • 原文地址:https://www.cnblogs.com/IntelligencePointer/p/14186697.html
Copyright © 2020-2023  润新知