• <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 聶文龍 閱讀(441) 評論(0)  編輯 收藏 引用 所屬分類: net work
            久久久久国产成人精品亚洲午夜| 久久这里都是精品| 久久亚洲春色中文字幕久久久| 久久精品国产亚洲AV无码麻豆| 久久精品成人免费国产片小草| 久久久久婷婷| 亚洲精品乱码久久久久66| 久久97久久97精品免视看秋霞| 久久人人爽人人人人爽AV| 国内精品久久久久久久久电影网 | 久久精品国产清高在天天线| 国产成人综合久久综合| 日本久久久久亚洲中字幕| 97久久精品人妻人人搡人人玩| 亚洲国产成人精品女人久久久| 日韩乱码人妻无码中文字幕久久| 97精品伊人久久久大香线蕉| 国产精品成人99久久久久 | 精品久久久久中文字幕日本| 亚洲中文字幕久久精品无码APP| 亚洲а∨天堂久久精品9966| 77777亚洲午夜久久多喷| 亚洲欧美成人久久综合中文网 | 亚洲va久久久久| 国产福利电影一区二区三区久久久久成人精品综合 | 久久国产精品久久久| 国内精品人妻无码久久久影院| 内射无码专区久久亚洲| 久久笫一福利免费导航| 久久99精品国产麻豆婷婷| 久久精品国产网红主播| 无码专区久久综合久中文字幕| 婷婷久久综合九色综合绿巨人| 99久久综合国产精品二区| 国产精品久久久久影院嫩草| 久久国产亚洲精品无码| 伊人久久大香线蕉av不变影院| 国产69精品久久久久观看软件| 九九久久自然熟的香蕉图片| 久久久久AV综合网成人| 久久成人国产精品免费软件|