zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    centos7.9安装Oracle 19c数据库(rpm方式)
    tomcat配置404/500自定义错误页面
    centos7.7部署多个tomcat服务器
    Linux配置Tomcat实现双向SSL认证(使用keytool工具生成证书)
    C#方法的多值返回方式
    Unity 判断2D/3D坐标系下的一个点是否在指定的摄像机视野范围内
    Unity项目的APK在雷电模拟器上弹出 "XXX停止运行"或者“XXX屡次停止运行”
    Python调用Unity工程下CSharp代码中的静态方法
    C#如何屏蔽程序的多次启动
    Something about My Blog
  • 原文地址:https://www.cnblogs.com/IntelligencePointer/p/14186697.html
Copyright © 2011-2022 走看看