C++远程监控系统发送端-play.cpp : IP组播套接字

//初始化IP组播套接字
int CPlayApp::InitMultiSocket()
{
    int SendBuf;
    DWORD cbRet;
    int status;
    BOOL bFlag;
    SOCKADDR_IN  SrcAddr;
    CMainFrame* pFrame=(CMainFrame*)m_pMainWnd;
    HWND m_hwnd=pFrame->m_hWnd;
    
   
    //创建一个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)
    {
        ErrMsg(m_hwnd,"WSASocket Error");
        return -1;
    }
       
    //设置套接字为可重用端口地址
    bFlag = TRUE;
    status = setsockopt(
        MultiSock,                
        SOL_SOCKET,                
        SO_REUSEADDR,            
        (char *)&bFlag,            
        sizeof (bFlag));
    if (status == SOCKET_ERROR)
    {
        ErrMsg(m_hwnd,"setsockopt Error");
        return -1;
    }


   // 将套接字绑扎到用户指定端口及默认的接口
    SrcAddr.sin_family = AF_INET;
    SrcAddr.sin_port = htons (DESTPORT);
    SrcAddr.sin_addr.s_addr = INADDR_ANY;
    status = bind (
        MultiSock,
        (struct sockaddr FAR *)&SrcAddr,
        sizeof(struct sockaddr));

    if (status == SOCKET_ERROR)
    {
        ErrMsg(m_hwnd,"bind Error");
        return -1;
    }

    nIP_TTL = 2;   //允许跨网传播
    // 设置多址广播数据报传播范围,允许跨网传播
    status = WSAIoctl (MultiSock,     
        SIO_MULTICAST_SCOPE,   
        &nIP_TTL,              
        sizeof (nIP_TTL),      
        NULL,             
        0,         
        &cbRet,                
        NULL,                  
        NULL);                 
    if (status)
    {
         ErrMsg(m_hwnd,"WSAIoctl Error");
        return -1;
    }

 
    // 允许内部回送(LOOPBACK)
      bFlag = TRUE;
      status = WSAIoctl (MultiSock,              /* socket */
          SIO_MULTIPOINT_LOOPBACK,               /* LoopBack on or off */
          &bFlag,                                /* input */
          sizeof (bFlag),                        /* size */
          NULL,                                      /* output */
          0,                                         /* size */
          &cbRet,                                    /* bytes returned */
          NULL,                                      /* overlapped */
          NULL);                                     /* completion routine */
      if (status)
      {
           ErrMsg(m_hwnd,"WSAIoctl Error");
          return -1;
      }
 
    

    //设定发送缓冲区为64k
    SendBuf=65536;
    status = setsockopt(
        MultiSock,                    
        SOL_SOCKET,                
        SO_SNDBUF,            
        (char *)&SendBuf,            
        sizeof(SendBuf));    
    if (status == SOCKET_ERROR)
    {
        ErrMsg(m_hwnd,"setsockopt Error");
        return -1;
    }
    //测试设定的发送缓冲区是否为64k
    int ASendBuf;
    int SLen=sizeof(ASendBuf);
    status=getsockopt(MultiSock,SOL_SOCKET,SO_SNDBUF,
               (char * )&ASendBuf, &SLen);
    
    if (status == SOCKET_ERROR)
    {
        ErrMsg(m_hwnd,"setsockopt Error");
        return -1;
    }
    if(status==0)
    {
         if(ASendBuf!=65536)
            return -1;
    }

    DestAddr.sin_family = AF_INET;
    DestAddr.sin_port = htons (DESTPORT);
    DestAddr.sin_addr.s_addr =inet_addr(MULTIDESTADDR);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

D20187

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

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

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

打赏作者

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

抵扣说明:

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

余额充值