当前位置: 首页 > news >正文

C++远程监控系统接收端- RevPlayMDIChildWnd.cpp


void CRevPlayWnd::InitMultiSock()
{
    int RevBuf;
    int status;
    BOOL  bFlag;
    CString ErrMsg;
    SOCKADDR_IN stLocalAddr;
    SOCKADDR_IN stDestAddr;
    SOCKET hNewSock;
    int RevLen=sizeof(RevBuf);
    //创建一个IP组播套接字
    MultiSock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
          (LPWSAPROTOCOL_INFO)NULL, 0,
          WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF);
    if (MultiSock == INVALID_SOCKET)
    {
        MessageBox("WSASocket() failed");
        return;
    }
    
    //允许对同一地址bind多次
    bFlag = TRUE;
    status = setsockopt(
        MultiSock,                    /* socket */
        SOL_SOCKET,                /* socket level */
        SO_REUSEADDR,            /* socket option */
        (char *)&bFlag,            /* option value */
         sizeof (bFlag));    /* size of value */

    if (status == SOCKET_ERROR)
    {
      ErrMsg.Format ("set SO_REUSEADDR failed, Err: %d",WSAGetLastError());
      MessageBox(ErrMsg);
      return;
    }
    // 将套接字绑定到用户指定端口
    stLocalAddr.sin_family = AF_INET;
  //  stLocalAddr.sin_port = htons (DestPort);
    stLocalAddr.sin_port = htons (201);
    stLocalAddr.sin_addr.s_addr = INADDR_ANY;
    status = bind (
        MultiSock,
        (struct sockaddr FAR *)&stLocalAddr,
        sizeof(struct sockaddr));

    if (status == SOCKET_ERROR)
    {
        ErrMsg.Format ("Bind(socket: %d, port: %d) failed, Err: %d",
            MultiSock, DestPort, WSAGetLastError());
        MessageBox(ErrMsg);
            
    }
    //设定接收缓冲区为64k
     RevBuf=65536;
    status = setsockopt(
        MultiSock,                    /* socket */
        SOL_SOCKET,                /* socket level */
        SO_RCVBUF,            /* socket option */
        (char *)&RevBuf,            /* option value */
        sizeof(RevBuf));    /* size of value */
    if (status == SOCKET_ERROR)
    {
        MessageBox("set SO_REVBUF error");
        return;
    }
    
    //加入组播组
    stDestAddr.sin_family = PF_INET;
    stDestAddr.sin_port = htons (201);
    stDestAddr.sin_addr.s_addr = inet_addr("234.5.6.7");
    hNewSock = WSAJoinLeaf (MultiSock, /* socket */
        (PSOCKADDR)&stDestAddr, /* multicast address */
        sizeof (stDestAddr),    /* length of addr struct */    
        NULL,                   /* caller data buffer */
        NULL,                   /* callee data buffer */
        NULL,                   /* socket QOS setting */
        NULL,                   /* socket group QOS */
        JL_RECEIVER_ONLY);               /* do both: send *and* receive */

    if (hNewSock == INVALID_SOCKET)
    {
      ErrMsg.Format ("WSAJoinLeaf() failed, Err: %d",WSAGetLastError());
      MessageBox(ErrMsg);
    }     
}

http://www.lryc.cn/news/909.html

相关文章:

  • QT之OpenGL深度测试
  • 用LCR测试仪测试无线充电系统中的线圈
  • 华为、南卡和漫步者蓝牙耳机怎么选?国产高性价比蓝牙耳机推荐
  • MySQl学习(从入门到精通12)
  • 08讲 | 基于STM32单片机NBIOT定位实战项目
  • 提取接近竖直物体(粗定位)
  • 程序环境和预处理
  • 财报解读:业务复苏迹象明显,中国中免能否重写增长神话?
  • macOS中虚拟机桥接模式分配静态ip
  • prometheus increase函数统计得到小数
  • C++学习记录——유 类和对象(3)
  • 基于Hi3861平台的OpenHarmony程序是如何启动运行的
  • 2023彻底解决Typora使用iPic微博图床失效问题
  • Revit中添加水平仰视平面图及水平剖面
  • Python 循环语句
  • 使用 ThreeJS 实现第一个三维场景(详)
  • 《小猫猫大课堂》三轮5——动态内存管理(通讯录动态内存化)
  • 【Selenium学习】Selenium 八大定位法
  • 算法训练营 day41 贪心算法 单调递增的数字 买卖股票的最佳时机含手续费
  • 【数据结构-JAVA】排序
  • 基于注解管理Bean
  • Containerd 的 Bug 导致容器被重建!如何避免?
  • win环境安装部署Jenkins
  • 网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面
  • Spring WebFlux
  • C++基础面试题:new和malloc的区别
  • WebDAV之葫芦儿·派盘+KMPlayer
  • 杨浦区人工智能及大数据(云计算)企业登记工作(2023年度)的通知
  • 2023年去培训机构学前端还是Java?
  • 【React】组件事件