• <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
            <2007年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(34)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            Multicasting

            多播通訊讓網絡客戶充分享受了廣播的便捷而又不用再擔心網絡會被風暴阻塞,所有這一切都歸功于 IGMP 協議的實施。
            多播地址是一個D類的IP地址(224.0.0.0-239.255.255.255),其中有一些是為特殊用途而分配的,詳細分配情況請參考 RFC1700。
            這里只講述IP多播。IP多播是無根多播,下面只羅列簡單的程序實現,詳細的規范請參考相應的文檔。

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

            // 使用Winsock2
            if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) return FALSE;
            // 創建多播套接字
            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;
            // 設置套接字選項
            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;
            }
            // 發送
            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);
            // 結束

            // 附上一個配置函數
            #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; // 多少塊網卡
            unsigned char szHostName[150]; // 主機名
            unsigned char szAddr[7*10]; // 每塊網卡地址以 0為間隔255.255.255.255.
            unsigned char szMac[7*10]; // 每塊網卡MAC地址0為間隔0x000x040x760x3F0x5F0xA9.
            }
            NICADDR,*LPNICADDR;

            typedef struct tagConfigParam
            {
            BOOL  bSender; // [IN] 是發送還是接收
            char* pszMcastAddr; // [IN] 多播組地址
            WORD  wMcastPort; // [IN] 多播端口
            NICADDR stuAddr; // [OUT]本地網卡地址信息,函數回填
            }
            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 聶文龍 閱讀(451) 評論(0)  編輯 收藏 引用 所屬分類: net work
            国内精品九九久久精品| 国产精品久久久久久久人人看| 久久无码国产专区精品| 麻豆AV一区二区三区久久| 久久久久久久99精品免费观看| 久久一区二区三区免费| 人妻久久久一区二区三区| 久久久精品久久久久特色影视| 久久久久亚洲精品日久生情| 情人伊人久久综合亚洲| 中文精品久久久久人妻不卡| 久久噜噜久久久精品66| 久久被窝电影亚洲爽爽爽| 伊人久久久AV老熟妇色| 久久人人爽人人爽人人片AV东京热| 国产婷婷成人久久Av免费高清 | 狠狠色丁香久久综合婷婷| 亚洲国产成人久久综合野外| 99热精品久久只有精品| 99久久99久久精品免费看蜜桃| 亚洲日本va中文字幕久久| 色综合久久久久综合99| 久久播电影网| 亚洲国产成人久久综合一区77| 999久久久国产精品| 国产午夜精品久久久久九九| 97久久超碰成人精品网站| 精品伊人久久久| 久久久久久午夜精品| 久久久久亚洲AV成人网| 狠狠精品久久久无码中文字幕| 九九99精品久久久久久| 秋霞久久国产精品电影院| 久久精品国产影库免费看| 伊人热人久久中文字幕| 精品多毛少妇人妻AV免费久久| 国产综合免费精品久久久| 香蕉久久夜色精品国产2020| 久久婷婷色综合一区二区| 精品久久久久久亚洲精品 | 2021久久国自产拍精品|