使用多播时的多播端口务必和主机Socket绑定的端口一致

使用多播时的多播端口必须和主机Socket绑定的端口一致?
DWORD CDlgMulticast::ThreadProc()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);

    m_hSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

    // 本地地址结构
    DWORD dwIPAddr = CSocketHelper::GetLocalIPAddr(0);

    struct sockaddr_in addr_local;
    memset(&addr_local, 0, sizeof(addr_local));
    addr_local.sin_family = AF_INET;
    addr_local.sin_addr.s_addr = dwIPAddr;
    addr_local.sin_port = htons(MULTICAST_PORT + 1);

    // 将套接字绑定到本地地址结构
    bind(m_hSocket, (struct sockaddr *) &addr_local, sizeof(addr_local));

    // 加入组播地址
    ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IPADDRESS);
    mreq.imr_interface.s_addr = dwIPAddr;
    setsockopt(m_hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));

    while (1) {
        char msgbuf[512] = {0};
        struct sockaddr_in addr_from;
        int len = sizeof(addr_from);
        int nbytes = recvfrom(m_hSocket, msgbuf, sizeof(msgbuf), 0, (struct sockaddr *) &addr_from, (socklen_t *)&len);
        
        int nErr = WSAGetLastError();

        Sleep(1);
    }

    WSACleanup();

    return TRUE;
}

在上面代码中,我将 socket绑定到这个地址 addr_local.sin_port = htons(MULTICAST_PORT + 1);
但是在向多播组发送数据的时候,我使用了如下的代码:
void CDlgMulticast::OnBnClickedBtnSend()
{
    // TODO: Add your control notification handler code here
    TCHAR szText[256] = {0};
    GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(szText, 256);
    Ark64::CW2A w2a(szText);

    BYTE byteBuffer[512] = {0};
    memcpy( byteBuffer, w2a.m_psz, sizeof(byteBuffer) );

    // 构建组播地址
    struct sockaddr_in addr_multicast;
    memset(&addr_multicast, 0, sizeof(addr_multicast));
    addr_multicast.sin_family = AF_INET;
    addr_multicast.sin_addr.s_addr = inet_addr(MULTICAST_IPADDRESS);
    addr_multicast.sin_port = htons(MULTICAST_PORT);

    // 从组播地址发送消息
    int nRet = sendto( m_hSocket, (char*)byteBuffer, sizeof(byteBuffer), 0, (sockaddr*)&addr_multicast, sizeof(addr_multicast) );
    if( nRet == SOCKET_ERROR ) {
        LogPrintf(_T("WSAErrorCode : %d/n"), WSAGetLastError());
    } else {
        LogPrintfA("It'm_hSocket OK.\n");
    }
}

addr_multicast.sin_port = htons(MULTICAST_PORT);这是多播的端口

当Socket绑定的端口和多播组的端口一致的话,发送给本机就可以成功,不一致就失败;请问为什么?

我的理解:
一个socket绑定到本地某端口,和多播组的端口其实应该没什么关系的。
recvfrom我认为就是用该socket在本地的端口接收从多播组某端口发来的数据。

但是实际情况和我设想的不一致,何解?


------解决思路----------------------
对于楼主的问题,前段时间我也一直在纠结各种端口问题。终于有了点新的。对于多播,还是UDP协议。 sendto的参数包含了目的方的ip和端口。   也就是说接受方只有设置为  发送 给的端口,才能接受到。所以你说要不要设置为一样的?? 还有多播 只是逻辑上的一种 划分 。在ip层或数据链路层上 做了处理。这个不要管。 这样你就可以把 多播 当成 单纯的udp了。 是不是容易理解了?我也是新手,最近也在学习这些东西。一起努力吧。