網絡編程之---廣播和IP多播

文章來源:

http://www.cnblogs.com/Clingingboy/archive/2011/06/21/2086349.html

2011-06-21 20:16 by Clingingboy


一.廣播

1.接收

void main()
{
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);

    // 首先要綁定一個本地地址,指明廣播端口號
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.S_un.S_addr = INADDR_ANY;    
    sin.sin_port = ::ntohs(4567);
    if(::bind(s, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf(" bind() failed \n");
        return;
    }

    // 接收廣播
    printf(" 開始在4567端口接收廣播數據... \n\n");
    SOCKADDR_IN addrRemote;    
    int nLen = sizeof(addrRemote);
    char sz[256];
    while(TRUE)
    {
        int nRet = ::recvfrom(s, sz, 256, 0, (sockaddr*)&addrRemote, &nLen);
        if(nRet > 0)
        {
            sz[nRet] = '\0';
            printf(sz);
        }
    }
}

2.發送

void main()
{
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
    // 有效SO_BROADCAST選項
    BOOL bBroadcast = TRUE;
    ::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));

    // 設置廣播地址,這裏的廣播端口號(電臺)是4567
    SOCKADDR_IN bcast;
    bcast.sin_family = AF_INET;
    bcast.sin_addr.s_addr = INADDR_BROADCAST; // ::inet_addr("255.255.255.255");
    bcast.sin_port = htons(4567);

    // 發送廣播
    printf(" 開始向4567端口發送廣播數據... \n \n");
    char sz[] = "This is just a test. \r\n";
    while(TRUE)
    {
        ::sendto(s, sz, strlen(sz), 0, (sockaddr*)&bcast, sizeof(bcast));
        ::Sleep(5000);
    }
}

二.IP多播

1.加入多播組並接收數據 

void main()
{
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);

    // 允許其它進程使用綁定的地址
    BOOL bReuse = TRUE;
    ::setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&bReuse, sizeof(BOOL));


    // 綁定到4567端口
    sockaddr_in si;
    si.sin_family = AF_INET;
    si.sin_port = ::ntohs(4567);
    si.sin_addr.S_un.S_addr = INADDR_ANY;
    ::bind(s, (sockaddr*)&si, sizeof(si));
    
    // 加入多播組
    ip_mreq    mcast;
    mcast.imr_interface.S_un.S_addr = INADDR_ANY;
    mcast.imr_multiaddr.S_un.S_addr = ::inet_addr("234.5.6.7");  // 多播地址爲234.5.6.7
    ::setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast));


    // 接收多播組數據
    printf(" 開始接收多播組234.5.6.7上的數據... \n");
    char buf[1280];
    int nAddrLen = sizeof(si);
    while(TRUE)
    {
        int nRet = ::recvfrom(s, buf, strlen(buf), 0, (sockaddr*)&si, &nAddrLen);
        if(nRet != SOCKET_ERROR)
        {
            buf[nRet] = '\0';
            printf(buf);
        }
        else
        {
            int n = ::WSAGetLastError();
            break;
        }
    }
}

2.發送廣播

同上

設置SO_REUSEADDR,則允許多個進程綁定到這個端號,這樣加入到同個端口的組都可以接收到數據

三.源地址的IP多播

即可指定接收組內特定IP地址的消息

c#參考:http://www.cnblogs.com/xuhx/archive/2004/06/23/18150.html 
http://www.cnblogs.com/xuhx/archive/2004/06/27/18960.html

Windows網絡與通信程序設計 第5章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章