• <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
            <2013年4月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            常用鏈接

            留言簿(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 聶文龍 閱讀(447) 評論(0)  編輯 收藏 引用 所屬分類: net work
            国产精品久久久久一区二区三区| 久久夜色精品国产噜噜噜亚洲AV| 99久久国产亚洲高清观看2024 | 狠狠色狠狠色综合久久 | 久久国产高清字幕中文| 一本久久久久久久| 久久福利资源国产精品999| 精品久久无码中文字幕| 久久精品亚洲男人的天堂| 精品国产乱码久久久久久呢 | 国产精品欧美久久久天天影视| 99久久综合国产精品二区| 久久久久久久久久久久久久| 色综合久久综精品| 亚洲伊人久久精品影院| 久久青青草原精品国产不卡| 国产精品久久久久影院色| 久久久久久精品无码人妻| 久久国产视屏| 亚洲国产精品人久久| 色88久久久久高潮综合影院| 亚洲v国产v天堂a无码久久| 国产高潮久久免费观看| 久久丫精品国产亚洲av不卡| 狠狠色丁香久久婷婷综合_中| 精品久久久久久无码免费| 久久91精品久久91综合| 国产亚洲精品美女久久久| 亚洲午夜久久久影院| 中文字幕久久波多野结衣av| 亚洲国产香蕉人人爽成AV片久久 | 国产aⅴ激情无码久久| 日韩精品无码久久一区二区三| 国产精品久久国产精品99盘| 久久99国产综合精品免费| 久久久亚洲欧洲日产国码aⅴ| 精品国产乱码久久久久久人妻| 婷婷久久综合| 2021国内久久精品| 久久精品国产亚洲AV久| 日韩精品久久无码中文字幕|