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);
    }     
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

D20187

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

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

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

打赏作者

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

抵扣说明:

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

余额充值