• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 298  文章 - 377  trackbacks - 0
            <2016年8月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(34)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊(cè)

            收藏夾

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            Multicasting

            多播通訊讓網(wǎng)絡(luò)客戶充分享受了廣播的便捷而又不用再擔(dān)心網(wǎng)絡(luò)會(huì)被風(fēng)暴阻塞,所有這一切都?xì)w功于 IGMP 協(xié)議的實(shí)施。
            多播地址是一個(gè)D類的IP地址(224.0.0.0-239.255.255.255),其中有一些是為特殊用途而分配的,詳細(xì)分配情況請(qǐng)參考 RFC1700。
            這里只講述IP多播。IP多播是無(wú)根多播,下面只羅列簡(jiǎn)單的程序?qū)崿F(xiàn),詳細(xì)的規(guī)范請(qǐng)參考相應(yīng)的文檔。

            #define MCASTADDR "234.5.6.7"
            #define MCASTPORT 65500
            #define COMMBUFSIZE 1024

            // 使用Winsock2
            if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) return FALSE;
            // 創(chuàng)建多播套接字
            SOCKET sock=WSASocket(AF_INET,
            SOCK_DGRAM,
            0,
            NULL,
            0,
            WSA_FLAG_MULTIPOINT_C_LEAF|
            WSA_FLAG_MULTIPOINT_D_LEAF|
            WSA_FLAG_OVERLAPPED);
            // 綁定套接字
            SOCKADDR_IN saiLocal;
            saiLocal.sin_family=AF_INET;
            saiLocal.sin_port=htons(MCASTPORT);
            saiLocal.sin_addr.S_un.S_addr=INADDR_ANY;
            if(bind(sock,(SOCKADDR*)&saiLocal,sizeof(saiLocal))==SOCKET_ERROR) return FALSE;
            // 設(shè)置套接字選項(xiàng)
            unsigned long ulNoneBlockingIO=1;
            if(SOCKET_ERROR==ioctlsocket(sock, FIONBIO,&ulNoneBlockingIO)) return FALSE;
            // Set TTL to 8
            int nOpt=8;
            if(setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char*)&nOpt,sizeof(nOpt))==SOCKET_ERROR) return FALSE;
            // Set Loopback
            if(m_bLoopBack)
            {
            BOOL bOpt=0;
            if(setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&bOpt,sizeof(bOpt))==SOCKET_ERROR) return FALSE;
            }
            // 加入多播組
            m_saiRemote.sin_family=AF_INET;
            m_saiRemote.sin_port=htons(MCASTPORT);
            m_saiRemote.sin_addr.S_un.S_addr=inet_addr(MCASTADDR);
            DWORD dwFlags=(m_bSender)?JL_SENDER_ONLY:JL_RECEIVER_ONLY;
            SOCKET sockM=WSAJoinLeaf(sock,(SOCKADDR*)&m_saiRemote,sizeof(m_saiRemote),NULL,NULL,NULL, NULL,dwFlags);
            if(sockM==INVALID_SOCKET)
            {
            closesocket(sock);
            WSACleanup();
            return FALSE;
            }
            // 發(fā)送
            int nRet=sendto(sock,(char*)pBuf,len,0,(SOCKADDR*)&m_saiRemote,sizeof(m_saiRemote));
            // 接收
            SOCKADDR_IN sai_From;
            int len = sizeof(sai_From);
            BYTE buf[COMMBUFSIZE]={'\0'};
            int nRetRecv=recvfrom(sock,(char*)buf,COMMBUFSIZE,0,(SOCKADDR*)&sai_From,&len);
            // 結(jié)束

            // 附上一個(gè)配置函數(shù)
            #include "Winsock2.h"
            #include "Ws2tcpip.h"

            #include "iprtrmib.h"
            #include "ipexport.h"
            #include "iptypes.h"
            #include "iphlpapi.h"

            #pragma comment(lib,"ws2_32.lib"
            #pragma comment(lib,"iphlpapi.lib"

            typedef struct tagNIC
            {
            int nNum; // 多少塊網(wǎng)卡
            unsigned char szHostName[150]; // 主機(jī)名
            unsigned char szAddr[7*10]; // 每塊網(wǎng)卡地址以 0為間隔255.255.255.255.
            unsigned char szMac[7*10]; // 每塊網(wǎng)卡MAC地址0為間隔0x000x040x760x3F0x5F0xA9.
            }
            NICADDR,*LPNICADDR;

            typedef struct tagConfigParam
            {
            BOOL  bSender; // [IN] 是發(fā)送還是接收
            char* pszMcastAddr; // [IN] 多播組地址
            WORD  wMcastPort; // [IN] 多播端口
            NICADDR stuAddr; // [OUT]本地網(wǎng)卡地址信息,函數(shù)回填
            }
            CONFIGPARAM,*LPCONFIGPARAM;

            void FuncConfig(CONFIGPARAM* pParam)
            {
            m_bSender=pParam->bSender;
            if(pParam->pszMcastAddr!=NULL)
            m_dwMulticastGroup=inet_addr(pParam->pszMcastAddr);
            if(pParam->wMcastPort!=0)
            m_dwPort=pParam->wMcastPort;
            memset(&(pParam->stuAddr),0,sizeof(NICADDR));
            char name[MAX_PATH]={'\0'};
            if(0==gethostname(name,MAX_PATH))
            {
            if(strlen(name)>0) strcpy((char*)pParam->stuAddr.szHostName,name);
            HOSTENT* HostEnt;
            HostEnt=gethostbyname(name);
            int n=0;
            int m=0;
            BOOL bNoConnected=TRUE;
            if(HostEnt!=NULL)
            {
            IP_ADAPTER_INFO AdapterInfo[16];
            PIP_ADAPTER_INFO pAdapterInfo;
            DWORD dwBufLen=sizeof(AdapterInfo);

            DWORD dwRet=GetAdaptersInfo(
            AdapterInfo,
            &dwBufLen);
            if(dwRet==ERROR_SUCCESS) pAdapterInfo=AdapterInfo;

            for(int i=0;HostEnt->h_addr_list[i]!=NULL;i++)
            {
            in_addr ia;
            memset(&ia,0,sizeof(ia));
            ia.S_un.S_addr = *((unsigned long*)HostEnt->h_addr_list[i]);
            char* pszIP = inet_ntoa(ia);
            int nLen=strlen(pszIP);
            memmove(pParam->stuAddr.szAddr+n,pszIP,nLen);
            n+=strlen(pszIP);
            n++;

            if(dwRet==ERROR_SUCCESS)
            {
            if(pAdapterInfo)
            {
            memmove(pParam->stuAddr.szMac+m,pAdapterInfo->Address,6);
            pAdapterInfo=pAdapterInfo->Next;
            m+=7;
            }
            }

            pParam->stuAddr.nNum++;
            }
            }
            }
            }
            posted on 2007-08-17 13:18 聶文龍 閱讀(441) 評(píng)論(0)  編輯 收藏 引用 所屬分類: net work
            久久亚洲中文字幕精品有坂深雪| 久久只有这精品99| 亚洲精品乱码久久久久66| 偷窥少妇久久久久久久久| 无码八A片人妻少妇久久| 久久天天躁狠狠躁夜夜96流白浆| 97久久综合精品久久久综合| 久久精品男人影院| 99久久综合国产精品免费| 久久综合给合久久狠狠狠97色 | 久久精品毛片免费观看| 日本免费一区二区久久人人澡| 久久久久亚洲av成人无码电影| 久久精品无码av| 91久久精一区二区三区大全| 99久久夜色精品国产网站| 偷窥少妇久久久久久久久| 国产亚洲精久久久久久无码AV| 偷窥少妇久久久久久久久| 精品国产婷婷久久久| 久久精品国产亚洲网站| 伊人久久大香线蕉亚洲| 久久久久一级精品亚洲国产成人综合AV区| 亚洲中文字幕无码久久综合网| 伊人精品久久久久7777| 国产精品无码久久四虎| 91精品国产色综合久久| 久久国产精品一国产精品金尊| 人妻无码αv中文字幕久久琪琪布| 久久www免费人成看国产片| 久久午夜电影网| 久久香蕉国产线看观看99| 久久综合狠狠综合久久综合88 | 深夜久久AAAAA级毛片免费看| 久久精品国产亚洲av水果派| 亚洲中文字幕无码久久综合网 | 一本大道久久香蕉成人网| 久久精品中文字幕第23页| 精品久久久久久久中文字幕 | 久久无码国产| 天天综合久久一二三区|