{"id":2039,"date":"2020-02-11T14:18:36","date_gmt":"2020-02-11T05:18:36","guid":{"rendered":"https:\/\/www.oji-koji.com\/?p=2039"},"modified":"2021-07-28T11:35:16","modified_gmt":"2021-07-28T02:35:16","slug":"%e3%83%9e%e3%83%ab%e3%83%81%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%88%e5%8f%97%e4%bf%a1%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0","status":"publish","type":"post","link":"https:\/\/www.oji-koji.com\/?p=2039","title":{"rendered":"\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u53d7\u4fe1\u30d7\u30ed\u30b0\u30e9\u30e0"},"content":{"rendered":"\n<p class=\"program_discription\">\u4eca\u56de\u306f\u3001\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u53d7\u4fe1\u30d7\u30ed\u30b0\u30e9\u30e0(UDPMulticastReceiver for Windows)\u3092\u4f5c\u308a\u307e\u3059\u3002<br><a href=\"https:\/\/www.oji-koji.com\/?p=1996\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"UDPMulticastSender\u306e\u4f5c\u6210 (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">UDPMulticastSender\u306e\u4f5c\u6210<\/a>\u3067\u8a18\u8ff0\u3057\u305f\u3088\u3046\u306b\u3001\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3078\u306e\u300c\u53c2\u52a0\u300d\u3001\u300c\u96e2\u8131\u300d<br>\u6a5f\u80fd\u3092UDPServer\u306b\u7d44\u307f\u8fbc\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\"><strong>UDPMultiRecveiver\u306b\u5fc5\u8981\u306a\u8a2d\u5b9a<\/strong><br><strong>\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3078\u306e\u53c2\u52a0\u30fb\u96e2\u8131<\/strong><\/p>\n\n\n\n<p class=\"source_code\">\u3010\u4f7f\u7528\u3059\u308b\u69cb\u9020\u4f53\u3011\nstruct group_req\n{\n    uint32_t    gr_interface;               \/\/ \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u756a\u53f7\n    struct      sockaddr_storage gr_group;  \/\/ \u30b0\u30eb\u30fc\u30d7\u30a2\u30c9\u30ec\u30b9\n};<\/p>\n\n\n\n<p class=\"program_discription\">\u3000\u3000(\uff0a)\u901a\u5e38gr_interface=0\u3092\u6307\u5b9a\u3059\u308b\u3068\u3059\u3079\u3066\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u304c\u5bfe\u8c61\u3068\u306a\u308a\u307e\u3059\u304c<br> \u3000\u3000\u4f7f\u7528\u3059\u308b\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u756a\u53f7\u3092\u6307\u5b9a\u3057\u306a\u3044\u3068\u52d5\u4f5c\u3057\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002<br> \u3000\u3000(\uff0a)IPv4\u3068IPv6\u3067\u7570\u306a\u308b\u69cb\u9020\u4f53\u3092\u4f7f\u7528\u3059\u308b\u65b9\u6cd5(\u53e4\u3044\u65b9\u6cd5)\u304c\u3042\u308a\u307e\u3059\u304c<br> \u3000\u3000\u3053\u3053\u3067\u306f\u3067\u306f\u540c\u3058\u69cb\u9020\u4f53\u3067\u5236\u5fa1\u3092\u884c\u3044\u307e\u3059(\u65b0\u3057\u3044\u65b9\u6cd5)\u3002<br> \u3000\u3000\u3053\u308c\u306f\u3001<strong><a href=\"https:\/\/tools.ietf.org\/html\/rfc3678\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"RFC 3678:Socket Interface Extensions for Multicast Source Filters (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">RFC 3678:Socket Interface Extensions for Multicast Source Filters<\/a><\/strong>\u306b<br> \u3000\u3000\u8a18\u8ff0\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\"><strong>\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3078\u306e\u53c2\u52a0<\/strong><br><strong>IPv4<\/strong><br>\u3000\u3000group_req mreq<br>\u3000\u3000setsockopt(socket, <strong>IPPROTO_IP<\/strong>, <strong>MCAST_JOIN_GROUP<\/strong>, (char *)&amp;mreq, sizeof(mreq));<br><strong>IPv6<\/strong><br>\u3000\u3000group_req mreq<br>\u3000\u3000setsockopt(socket, <strong>IPPROTO_IPV6<\/strong>, <strong>MCAST_JOIN_GROUP<\/strong>, (char *)&amp;mreq, sizeof(mreq));<\/p>\n\n\n\n<p><strong>\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u304b\u3089\u306e\u96e2\u8131<\/strong><br><strong>IPv4<\/strong><br>\u3000\u3000group_req mreq<br>\u3000\u3000setsockopt(socket, <strong>IPPROTO_IP<\/strong>, <strong>MCAST_LEAVE_GROUP<\/strong>, (char *)&amp;mreq, sizeof(mreq));<br><strong>IPv6<\/strong><br>\u3000\u3000group_req mreq<br>\u3000\u3000setsockopt(socket, <strong>IPPROTO_IPV6<\/strong>, <strong>MCAST_LEAVE_GROUP<\/strong>, (char *)&amp;mreq, sizeof(mreq));<\/p>\n\n\n\n<p class=\"program_discription\">\u305d\u308c\u3067\u306f<strong>UDPMulticastReceiver for Windows<\/strong>\u3092\u4f5c\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u3087\u3046\u3002<br>\u30d7\u30ed\u30b0\u30e9\u30e0\u8d77\u52d5\u6642\u306b\u53c2\u52a0\u3059\u308b\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8(\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3001\u30dd\u30fc\u30c8\uff09\u3068<br>\u4f7f\u7528\u3059\u308b\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br>\u8d77\u52d5\u5f8c\u30e1\u30cb\u30e5\u30fc\u3067\u53c2\u52a0\/\u96e2\u8131\u3092\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u30d7\u30ed\u30b0\u30e9\u30e0\u8d77\u52d5\u5f15\u6570\n\u3000\u3000&lt;Multicast IP&gt; &lt;Port&gt; [&lt;InterfaceName&gt;]\n\u30e1\u30cb\u30e5\u30fc\n\u3000\u3000+\uff1a\u53c2\u52a0\n\u3000\u3000-\uff1a\u96e2\u8131\n\u3000\u3000q\uff1a\u7d42\u4e86<\/p>\n\n\n\n<p class=\"program_discription\"><strong>UDPMulticastReceiver\u306e\u4f5c\u6210\uff08Windows\uff09<\/strong><br><strong><a href=\"https:\/\/www.oji-koji.com\/?p=1956\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"UDPServer for Windows (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">UDPServer for Windows<\/a><\/strong>\u3092\u30b3\u30d4\u30fc\u3057\u3066\u30d5\u30a9\u30eb\u30c0\u540d\u3092UDPMulticastReceiver\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<br>\u4ee5\u4e0b\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u305d\u306e\u307e\u307e\uff08\u5909\u66f4\u306a\u304f\uff09\u4f7f\u7528\u3057\u307e\u3059\u3002<br>\u3000\u3000define.h<br>\u3000\u3000MySyncObject.cpp, MySyncObject.h<br>\u3000\u3000RingBuff.cpp, RingBuff.h<br>\u3000\u3000stdThread.cpp, stdThread.h<br>\u3000\u3000ThreadJob.cpp, ThreadJob.h<br>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3001\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u540d\u3092UDPMulticastReceiver\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<br>UDPServer.cpp\u3092UDPMulticastReceiver.cpp\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<br>SendRecvThread.cpp, SendRecvThread.h\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308a\u8fd4\u3059\u90e8\u5206\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2020\/02\/MulticastRecieverWin.png\" data-rel=\"lightbox-gallery-QxsBwgFZ\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2020\/02\/MulticastRecieverWin-1024x737.png\" alt=\"\" class=\"wp-image-2049\" width=\"768\" height=\"553\" srcset=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2020\/02\/MulticastRecieverWin-1024x737.png 1024w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2020\/02\/MulticastRecieverWin-300x216.png 300w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2020\/02\/MulticastRecieverWin-768x552.png 768w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2020\/02\/MulticastRecieverWin.png 1439w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/figure>\n\n\n\n<p class=\"program_discription\"><strong>UDPMulticastReceiver.cpp<\/strong>\u306eUDPServer.cpp\u304b\u3089\u306e\u5909\u66f4\u70b9\u306f\u6b21\u306e\u901a\u308a\u3067\u3059\u3002<br><strong>(1)\u53d7\u4fe1\u30bd\u30b1\u30c3\u30c8\u3001\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u306f1\u3064<\/strong>\uff08\u6307\u5b9a\u3057\u305f\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30a2\u30c9\u30ec\u30b9\u3067\u6c7a\u307e\u308b\uff09<br><strong>(2)\u8d77\u52d5\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u5909\u66f4\u3001\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u5bfe\u5fdc\u306b\u5909\u66f4\u3057\u305f\u6a5f\u80fd\u3092\u547c\u3073\u51fa\u3059<\/strong><br>\u3000\u3000main<br><strong>(3)\u30e1\u30cb\u30e5\u30fc\u5bfe\u5fdc<\/strong><br>\u3000\u3000DispMenu\u3001GetKeyString<br><strong>(4)\u30bd\u30b1\u30c3\u30c8\u4f5c\u6210\u306b\u6307\u5b9a\u3055\u308c\u305f\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3059\u308b<\/strong><br>\u3000bind\u306fAI_PASSIVE\u3067\u884c\u3046(\u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u306a\u3044)<br>\u3000\u3000CreateAndBindSocket\u3001SetRecvSocketOption<br><strong>(5)\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3078\u306e\u53c2\u52a0\u30fb\u96e2\u8131\u3092\u884c\u3046<\/strong><br>\u3000\u3000main\u3001SetMutiticastInfo\u3001GetInterfaceInfo\u3001MGroupControl<\/p>\n\n\n\n<p class=\"program_discription\">\u5909\u66f4\u3092\u9806\u756a\u306b\u884c\u3046\u3053\u3068\u306b\u3057\u307e\u3057\u3087\u3046\u3002<br> <strong>(1)\u53d7\u4fe1\u30bd\u30b1\u30c3\u30c8\u3001\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u306f1\u3064<\/strong>\uff08\u6307\u5b9a\u3057\u305f\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30a2\u30c9\u30ec\u30b9\u3067\u6c7a\u307e\u308b\uff09<br>\u3000\u3000MAX_SOCKET_NUM\u3067\u6307\u5b9a\u3057\u3066\u3044\u308b\u914d\u5217\u304b\u30891\u3064\u306e\u5909\u6570\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastReceiver.cpp\u3011\n\/\/ \u5909\u6570\u306e\u5ba3\u8a00\nSOCKET              m_fdServer;                     \/\/ \u2605(1)bind\u6e08\u307fUDP\u30bd\u30b1\u30c3\u30c8\nCSendRecvThread     *m_pCSendRecvThread = NULL;     \/\/ \u2605(1)\nConnectionInfoRec   *m_pConInfo = NULL;             \/\/ \u2605(1)\nCMySyncObject       *m_pCMySyncObject = NULL;       \/\/ \u2605(1)\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605(1)\u30bd\u30b1\u30c3\u30c8\u306e\u7834\u68c4\u3001\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u306e\u7834\u68c4\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      \u306a\u3057\n\/\/==============================================\nvoid Stop()\n{\n    fprintf(stderr, &#8220;Stop()\\n&#8221;);\n    \/\/\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u306e\u7834\u68c4, \u63a5\u7d9a\u6e08\u307f\u30bd\u30b1\u30c3\u30c8\u306e\u7834\u68c4\n    if (m_pCSendRecvThread != NULL)\n    {\n        m_pCSendRecvThread-&gt;End();\n        m_pCSendRecvThread-&gt;WaitForEnd();\n        SAFE_DELETE(m_pCSendRecvThread);\n\n        DestroySocket(m_pConInfo-&gt;fdClient);\n        SAFE_FREE(m_pConInfo)\n    }\n}<\/p>\n\n\n\n<p class=\"program_discription\"><strong>(3)\u30e1\u30cb\u30e5\u30fc\u5bfe\u5fdc<\/strong><\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastReceiver.cpp\u3011\n#define     CMD_QUIT_CHAR   &#8216;q&#8217;     \/\/ \u2605(3)\n#define     CMD_JOIN_CHAR   &#8216;+&#8217;     \/\/ \u2605(3)\n#define     CMD_LEAVE_CHAR  &#8216;-&#8216;     \/\/ \u2605(3)\n\n\/\/ \u95a2\u6570\u306e\u5ba3\u8a00\nvoid DispMenu();                                \/\/ \u2605(3)\nint GetKeyString(LPSTR pszString, int iSize);   \/\/ \u2605(3)\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605\u30e1\u30cb\u30e5\u30fc\u306e\u8868\u793a\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      \u306a\u3057\n\/\/==============================================\nvoid DispMenu()\n{\n    fprintf(stderr, &#8220;%c:quit %c:Join %c:Leave  : &#8220;, CMD_QUIT_CHAR, CMD_JOIN_CHAR, CMD_LEAVE_CHAR);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30ad\u30fc\u30dc\u30fc\u30c9\u5165\u529b(\u6539\u884c\u307e\u3067)\u306e\u53d6\u5f97\n\/\/      \u5165\u529b\u304c\u306a\u3044\u3068\u304d\u306f\u3059\u3050\u306b\u30ea\u30bf\u30fc\u30f3\n\/\/ parameter\n\/\/      LPSTR   pszString   [in\/out]\u30c7\u30fc\u30bf\u683c\u7d0d\u7528\u30d0\u30c3\u30d5\u30a1\n\/\/      int     iSize       [in]\u30d0\u30c3\u30d5\u30a1\u306e\u30b5\u30a4\u30ba\n\/\/ return\n\/\/      0:\u5165\u529b\u306a\u3057 CMD_QUIT_CHAR:\u7d42\u4e86 CMD_SEND_MSG_CHAR:\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1\n\/\/==============================================\nint GetKeyString(LPSTR pszString, int iSize)\n{\n    int     iRet = 0;\n\n    memset(pszString, 0, iSize);\n    if (_kbhit())\n    {\n        switch (_getch())\n        {\n            case CMD_QUIT_CHAR:\n                iRet = CMD_QUIT_CHAR;\n                break;\n            case CMD_JOIN_CHAR:\n                iRet = CMD_JOIN_CHAR;\n                break;\n            case CMD_LEAVE_CHAR:\n                iRet = CMD_LEAVE_CHAR;\n                break;\n            default:\n                break;\n        }\n    }\n    return(iRet);\n}<\/p>\n\n\n\n<p class=\"program_discription\"><strong>(5)\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3078\u306e\u53c2\u52a0\u30fb\u96e2\u8131\u3092\u884c\u3046<\/strong><br>\u3000\u3000\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u5236\u5fa1\u7528\u306e\u5909\u6570\u306e\u8ffd\u52a0<br>\u3000\u3000\u8d77\u52d5\u5f15\u6570\u3067\u6307\u5b9a\u3055\u308c\u305f\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3092\u5909\u6570\u306b\u683c\u7d0d\u95a2\u6570\u306e\u8ffd\u52a0<br>\u3000\u3000\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u5236\u5fa1\u95a2\u6570\u306e\u8ffd\u52a0<\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastReceiver.cpp\u3011\n\/\/ \u95a2\u6570\u306e\u5ba3\u8a00\nvoid SetMutiticastInfo(LPSTR szIFName, LPSTR szAddr, LPSTR szPort);         \/\/ \u2605(5)\nsockaddr *GetInterfaceInfo(int iFamily, LPCSTR szIFName, DWORD *pdwIndex);  \/\/ \u2605(5)\nBOOL MGroupControl(BOOL fJoin, SOCKET fdRecv, group_req *pmreq);            \/\/ \u2605(5)\n\n\/\/ \u5909\u6570\u306e\u5ba3\u8a00\ngroup_req   m_mreq;                         \/\/ \u2605(5)\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605(5)\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u53c2\u52a0\u30fb\u96e2\u8131\u7528\u60c5\u5831\u53d6\u5f97\n\/\/      \u30a2\u30c9\u30ec\u30b9\u3068\u30dd\u30fc\u30c8\u304cm_mreq\u306b\u683c\u7d0d\u3055\u308c\u308b\n\/\/ parameter\n\/\/      LPSTR   szIFName    [in]\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\/NULL\n\/\/      LPSTR   szAddr      [in]\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30a2\u30c9\u30ec\u30b9\n\/\/      LPCSTR  szPort      [in]\u30dd\u30fc\u30c8\u756a\u53f7\n\/\/ return\n\/\/      TRUE\/FALSE\n\/\/==============================================\nvoid SetMutiticastInfo(LPSTR szIFName, LPSTR szAddr, LPSTR szPort)\n{\n    sockaddr    *pAddr;\n    addrinfo    hints, *pres = NULL;\n\n    DWORD        dwIFIndex;\n\n    memset(&amp;m_mreq, 0, sizeof(group_req));\n\n    memset(&amp;hints, 0, sizeof(hints));\n    hints.ai_socktype = SOCK_DGRAM;\n    if (getaddrinfo(szAddr, szPort, &amp;hints, &amp;pres) != 0)\n    {\n        DispErrorMsg(&#8220;Err:getaddrinfo()&#8221;);\n        goto L_END;\n    }\n    pAddr = GetInterfaceInfo(pres-&gt;ai_family, szIFName, &amp;dwIFIndex);\n    SAFE_FREE(pAddr)\n    m_mreq.gr_interface = dwIFIndex;                                \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u683c\u7d0d\n    memcpy(&amp;(m_mreq.gr_group), pres-&gt;ai_addr, pres-&gt;ai_addrlen);    \/\/ \u30a2\u30c9\u30ec\u30b9\u3092\u683c\u7d0d\n\nL_END:\n    if (pres != NULL)\n        freeaddrinfo(pres);\n    return;\n}\n\n\/\/==============================================&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\/\/ Function\n\/\/      \u2605(5)\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u5236\u5fa1(IPv4\/IPv6)\n\/\/ Parameter\n\/\/      BOOL        fJoin       [in]TRUE:\u53c2\u52a0 FALSE:\u96e2\u8131\n\/\/      SOCKET      fd          [in]\u30bd\u30b1\u30c3\u30c8\n\/\/      struct group_req *pmreq [in]\u5bfe\u8c61\u3068\u3059\u308b\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\n\/\/ Return\n\/\/      TRUE\/FALSE\n\/\/==============================================&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\nBOOL MGroupControl(BOOL fJoin, SOCKET fdRecv, group_req *pmreq)\n{\n    int     iRet = -1;\n    BOOL    fRet;\n\n    if (fJoin == TRUE)\n    {\n        if (pmreq-&gt;gr_group.ss_family == AF_INET)\n            iRet = setsockopt(fdRecv, IPPROTO_IP, MCAST_JOIN_GROUP, (char *)pmreq, sizeof(struct group_req));\n        else if (pmreq-&gt;gr_group.ss_family == AF_INET6)\n            iRet = setsockopt(fdRecv, IPPROTO_IPV6, MCAST_JOIN_GROUP, (char *)pmreq, sizeof(struct group_req));\n    }\n    else\n    {\n        if (pmreq-&gt;gr_group.ss_family == AF_INET)\n            iRet = setsockopt(fdRecv, IPPROTO_IP, MCAST_LEAVE_GROUP, (char *)pmreq, sizeof(struct group_req));\n        else if (pmreq-&gt;gr_group.ss_family == AF_INET6)\n            iRet = setsockopt(fdRecv, IPPROTO_IPV6, MCAST_LEAVE_GROUP, (char *)pmreq, sizeof(struct group_req));\n    }\n    fRet = (iRet == 0) ? TRUE : FALSE;\n    if (fRet == FALSE)\n        DispErrorMsg(&#8220;Err:MGroupControl&#8221;);\n    return(fRet);\n}<\/p>\n\n\n\n<p class=\"program_discription\">sockaddr *GetInterfaceInfo(int iFamily, LPCSTR szIFName, DWORD *pdwIndex)<br>\u306f<a rel=\"noreferrer noopener\" aria-label=\"UDPMulticastSender.cpp (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\" href=\"https:\/\/www.oji-koji.com\/?p=1996\" target=\"_blank\"><strong>UDPMulticastSender.cpp<\/strong><\/a>\u3067\u4f7f\u3063\u305f\u3082\u306e\u3068\u540c\u3058\u306a\u306e\u3067\u30b3\u30d4\u30fc\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p class=\"program_discription\"><strong>(4)\u30bd\u30b1\u30c3\u30c8\u4f5c\u6210\u306b\u6307\u5b9a\u3055\u308c\u305f\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3059\u308b<\/strong><br> \u3000bind\u306fAI_PASSIVE\u3067\u884c\u3046(\u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u306a\u3044)<\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastReceiver.cpp\u3011\n\/\/ \u95a2\u6570\u306e\u5ba3\u8a00\nBOOL CreateAndBindSocket(LPCSTR szAddress, WORD wPort);         \/\/ \u2605(4)\u30bd\u30b1\u30c3\u30c8\u306e\u4f5c\u6210\u3068\u540d\u524d\u4ed8\u3051\nBOOL SetRecvSocketOption(SOCKET fd, int iFamily, LPSTR szPort); \/\/ \u2605(4)\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605(4)\u30bd\u30b1\u30c3\u30c8\u306e\u4f5c\u6210\u3068bind\u306e\u5b9f\u65bd\n\/\/      m_fdServer\u306b\u683c\u7d0d\u3055\u308c\u308b\n\/\/ parameter\n\/\/      LPCSTR  szAddress   [in]\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30a2\u30c9\u30ec\u30b9\n\/\/      WORD    wPort       [in]\u53d7\u4fe1\u30dd\u30fc\u30c8\u756a\u53f7\n\/\/ return\n\/\/      TRUE\/FALSE\n\/\/==============================================\nBOOL CreateAndBindSocket(LPCSTR szAddress, WORD wPort)\n{\n    BOOL        fRet = FALSE;\n    SOCKET      fd = INVALID_SOCKET;\n    addrinfo    hints, *pres = NULL, *pTemp = NULL;\n    char        szPort[NI_MAXSERV];\n\n    fprintf(stderr, &#8220;CreateAndBindSocket()\\n&#8221;);\n\n    memset(&amp;hints, 0, sizeof(hints));\n    hints.ai_socktype = SOCK_DGRAM;\n    DISABLE_C4996\n    sprintf(szPort, &#8220;%d&#8221;, wPort);\n    ENABLE_C4996\n\n\/\/ \u30bd\u30b1\u30c3\u30c8(IPv4\/v6)\u3092\u4f5c\u308b\u305f\u3081\u306b\u306f\u30a2\u30c9\u30ec\u30b9\u304c\u308f\u304b\u308c\u3070\u826f\u3044\n    if (getaddrinfo(szAddress, NULL, &amp;hints, &amp;pres) == 0)\n    {\n\/\/ \u9806\u756a\u306bpres\u306e\u4e2d\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u60c5\u5831\u3092\u4f7f\u7528\u3059\u308b\n        pTemp = pres;\n        while (pTemp != NULL)\n        {\n\/\/ \u30bd\u30b1\u30c3\u30c8\u4f5c\u6210\n            if((fd = socket(pTemp-&gt;ai_family, pTemp-&gt;ai_socktype, pTemp-&gt;ai_protocol)) == INVALID_SOCKET)\n                goto L_NEXT;\n            fprintf(stderr, &#8220;%d %d %d %d\\n&#8221;, (int)fd, pTemp-&gt;ai_family, AF_INET, AF_INET6);\n\/\/ \u53d7\u4fe1\u30bd\u30b1\u30c3\u30c8\u306e\u8a2d\u5b9a(bind)\n            if (SetRecvSocketOption(fd, pTemp-&gt;ai_family, szPort) == FALSE)\n            {\n                DispErrorMsg(&#8220;Err:SetRecvSocketOption&#8221;);\n                DestroySocket(fd);\n                goto L_NEXT;\n            }\n            m_fdServer = fd;\n            fRet = TRUE;\n            break;\nL_NEXT:\n            pTemp = pTemp-&gt;ai_next;\n        }\n        freeaddrinfo(pres);\n    }\n    if (m_fdServer == INVALID_SOCKET)        \/\/ \u30bd\u30b1\u30c3\u30c8\u4f5c\u6210\u306b\u5931\u6557\n        fRet = FALSE;\n    return(fRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605(4)\u53d7\u4fe1\u30bd\u30b1\u30c3\u30c8\u306e\u8a2d\u5b9a\n\/\/      bind\n\/\/ parameter\n\/\/      SOCKET  fd          [in]\u30bd\u30b1\u30c3\u30c8\n\/\/      int     iFamily     [in]\u30d5\u30a1\u30df\u30ea\n\/\/      LPCSTR  szPort      [in]\u30dd\u30fc\u30c8\u756a\u53f7\n\/\/ return\n\/\/        TRUE\/FALSE\n\/\/==============================================\nBOOL SetRecvSocketOption(SOCKET fd, int iFamily, LPSTR szPort)\n{\n    BOOL        fRet = FALSE;\n    addrinfo    hints, *pres = NULL, *ptemp = NULL;\n    int         on = 1;\n\n#ifdef IPV6_V6ONLY\n    \/\/ IPv6\u30bd\u30b1\u30c3\u30c8\u3067IPv4\u5c04\u5f71\u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528\u3057\u306a\u3044\u3088\u3046\u306b\u8a2d\u5b9a\n    if (iFamily == AF_INET6)\n    {\n        on = 1;\n        if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&amp;on, sizeof(on)) &lt; 0)\n        {\n            DispErrorMsg(&#8220;Err:setsockopt()&#8221;);\n            DestroySocket(fd);\n            goto L_END;\n        }\n    }\n#endif\n\/\/ UDP\u3067\u306fSO_REUSEADDR\u4f7f\u308f\u306a\u3044\n\n\/\/ bind(\u30dd\u30fc\u30c8\u3092\u6307\u5b9a\u3057\u3001\u30a2\u30c9\u30ec\u30b9\u306f\u6307\u5b9a\u3057\u306a\u3044(PASSIVE))\n    memset(&amp;hints, 0, sizeof(hints));\n    hints.ai_socktype = SOCK_DGRAM;            \/\/ UDP\n    hints.ai_family = iFamily;\n    hints.ai_flags = AI_PASSIVE;\n    if (getaddrinfo(NULL, szPort, &amp;hints, &amp;pres) != 0)\n    {\n        DispErrorMsg(&#8220;Err:getaddrinfo()&#8221;);\n        goto L_END;\n    }\n    if (bind(fd, pres-&gt;ai_addr, (int)pres-&gt;ai_addrlen) == SOCKET_ERROR)\n    {\n        DispErrorMsg(&#8220;Err:bind()&#8221;);\n        goto L_END;\n    }\n    fRet = TRUE;\nL_END:\n    if (pres != NULL)\n        freeaddrinfo(pres);\n    return(fRet);\n}<\/p>\n\n\n\n<p class=\"program_discription\"><strong>(2)\u8d77\u52d5\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u5909\u66f4\u3001\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u5bfe\u5fdc\u306b\u5909\u66f4\u3057\u305f\u6a5f\u80fd\u3092\u547c\u3073\u51fa\u3059<\/strong><\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastReceiver.cpp\u3011\nint main(int argc, char *argv[])\n{\n    int     iRet = -1;\n    char    szKeyInBuff[81] = {0};\n    LPSTR   pszIFName = NULL;       \/\/ \u2605\u9001\u4fe1\u5143\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u540d\n\n\n\/\/  EnableESC(stderr);              \/\/ \u2605\u52d5\u4f5c\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081ECS\u30b7\u30fc\u30b1\u30f3\u30b9\u306b\u3088\u308b\u753b\u9762\u5236\u5fa1\u3092OFF\u306b\n    Locate(1, 1, 2);\n    m_pCMySyncObject = new CMySyncObject();\n    m_pCMySyncObject-&gt;Initialize();\n\n    \/\/ \u2605\u8d77\u52d5\u30d1\u30e9\u30e1\u30fc\u30bf\u30c1\u30a7\u30c3\u30af\n    if ((argc != 3) &amp;&amp; (argc != 4))\n    {\n        fprintf(stderr, &#8220;%s &lt;Multicast IP&gt; &lt;Port&gt; [&lt;InterfaceName&gt;]\\n&#8221;, argv[0]);\n        goto L_END;\n    }\n    if (argc == 4)\n        pszIFName = argv[3];\n\n    \/\/ \u30bd\u30b1\u30c3\u30c8\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u521d\u671f\u5316\n    if (InitSocketLib() == FALSE)\n        goto L_END;\n\n    \/\/ \u2605\u5909\u6570\u306e\u521d\u671f\u5316\n    m_fdServer = INVALID_SOCKET;\n\n    \/\/ \u2605UDP\u30bd\u30b1\u30c3\u30c8\u306e\u4f5c\u6210\u3068bind\n    if (CreateAndBindSocket(argv[1], (WORD)atol(argv[2])) == FALSE)\n        goto L_END;\n\n    \/\/ \u2605\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u53c2\u52a0\u30fb\u96e2\u8131\u7528\u60c5\u5831\u53d6\u5f97\n    SetMutiticastInfo(pszIFName, argv[1], argv[2]);\n\n    \/\/ \u2605\u9001\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u306e\u4f5c\u6210\n    m_pConInfo = (ConnectionInfoRec *)calloc(1, sizeof(ConnectionInfoRec));\n    m_pConInfo-&gt;pCMySyncObject = m_pCMySyncObject;\n    m_pConInfo-&gt;fdClient = m_fdServer;\n    m_pCSendRecvThread = new CSendRecvThread(m_pConInfo);\n    m_pCSendRecvThread-&gt;Begin();\n\n    \/\/ \u2605\u30e1\u30cb\u30e5\u30fc\u8868\u793a\u3068\u51e6\u7406\u306e\u5b9f\u884c\n    DispMenu();\n    while (1)\n    {\n        Sleep(10);                  \/\/ Sleep\u3092\u5165\u308c\u3066\u304a\u304f\u65b9\u304cCPU\u8ca0\u8377\u306e\u3053\u3068\u3092\u8003\u3048\u308b\u3068\u826f\u3044\u3067\u3057\u3087\u3046\n        switch (GetKeyString(szKeyInBuff, sizeof(szKeyInBuff)))\n        {\n            case 0:\n                break;\n            case CMD_QUIT_CHAR:\n                goto L_END;\n                break;\n            case CMD_JOIN_CHAR:\n                MGroupControl(TRUE, m_fdServer, &amp;m_mreq);\n                DispMenu();\n                break;\n            case CMD_LEAVE_CHAR:\n                MGroupControl(FALSE, m_fdServer, &amp;m_mreq);\n                DispMenu();\n                break;\n        }\n    }\n    iRet = 0;\nL_END:\n    \/\/ \u3059\u3079\u3066\u306e\u30bd\u30b1\u30c3\u30c8\u306e\u7834\u68c4\n    Stop();\n    m_pCMySyncObject-&gt;Uninitialize();\n    SAFE_DELETE(m_pCMySyncObject)\n\/\/ \u30bd\u30b1\u30c3\u30c8\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u958b\u653e\n    UninitSocketLib();\n    return(iRet);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u6700\u5f8c\u306bCSendRecvThread\u304b\u3089\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308a\u8fd4\u3059\u90e8\u5206\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010SendRecvThread.cpp\u3011\n\/\/==============================================\n\/\/ function\n\/\/      \u30e1\u30c3\u30bb\u30fc\u30b8\u30b3\u30de\u30f3\u30c9\u306e\u53d7\u4fe1\n\/\/ parameter\n\/\/      HeaderRec *pHeader  [in]\u4eee\u8aad\u307f\u3057\u305f\u30d8\u30c3\u30c0\n\/\/ return\n\/\/      0:\u30d1\u30b1\u30c3\u30c8\u304c\u63c3\u3063\u3066\u3044\u306a\u3044\n\/\/      1:\u30d1\u30b1\u30c3\u30c8\u3092\u53d7\u4fe1\u3057\u305f\u306e\u3067\u51e6\u7406\u3092\u884c\u3063\u305f\n\/\/      -1:\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\n\/\/==============================================\nBOOL CSendRecvThread::RecvMessagePacket(HeaderRec *pHeader)\n{\n&#8230;\n\/\/    SendMessagePacket(pszMsg, iMsgSize);\n&#8230;\n}<\/p>\n\n\n\n<p class=\"program_discription\">UDPMulticastSender\u3092\u52d5\u304b\u3057\u3066\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1\u3092\u958b\u59cb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastSender\u3011\nC:\\&gt;UDPMulticastSender.exe ff1e::1 10000\nq:quit m:\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1 :m\n\u9001\u4fe1\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 : aaaaaaaaaaa  \u3010\u30c7\u30fc\u30bf\u9001\u4fe1\u958b\u59cb\u3011<\/p>\n\n\n\n<p class=\"program_discription\">UDPMulticastReceiver\u3092\u52d5\u304b\u3057\u307e\u3059\u3002<br>JOIN\u3059\u308b\u307e\u3067\u3001\u30c7\u30fc\u30bf\u306f\u53d7\u4fe1\u3057\u307e\u305b\u3093\u3002<br>JOIN\u3057\u3066\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3059\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010UDPMulticastReceiver\u3011\nC:\\&gt;UDPMulticastReceiver.exe ff1e::1 10000\nCreateAndBindSocket()\n276 23 2 23\nq:quit +:Join -:Leave  : +                      \u3010\u3053\u3053\u3067JOIN\u3057\u3066\u30c7\u30fc\u30bf\u53d7\u4fe1\u958b\u59cb\u3011\nrecvfrom socket:276 Addr:2001:ce8:132:4332:3c16:217e:6aae:dc25 Port:56490 498660\n:CMD:100Msg:recv 12aaaaaaaaaaa\nrecvfrom socket:276 Addr:2001:ce8:132:4332:3c16:217e:6aae:dc25 Port:56490 498665\n:CMD:100Msg:recv 13aaaaaaaaaaa\nrecvfrom socket:276 Addr:2001:ce8:132:4332:3c16:217e:6aae:dc25 Port:56490 498670\n:CMD:100Msg:recv 14aaaaaaaaaaa\nq:quit +:Join -:Leave  : &#8211;                      \u3010\u3053\u3053\u3067LEAVE\u3057\u3066\u30c7\u30fc\u30bf\u53d7\u4fe1\u505c\u6b62\u3011\nq:quit +:Join -:Leave  : +                      \u3010\u3053\u3053\u3067JOIN\u3057\u3066\u30c7\u30fc\u30bf\u53d7\u4fe1\u518d\u958b\u3011\nrecvfrom socket:276 Addr:2001:ce8:132:4332:3c16:217e:6aae:dc25 Port:56490 498685\n:CMD:100Msg:recv 17aaaaaaaaaaa\nrecvfrom socket:276 Addr:2001:ce8:132:4332:3c16:217e:6aae:dc25 Port:56490 498690\n:CMD:100Msg:recv 18aaaaaaaaaaa<\/p>\n\n\n\n<p class=\"program_discription\">Linux\u7248\u3082\u540c\u69d8\u306e\u5bfe\u5fdc\u3067\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br> \u4ee5\u4e0b\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30ea\u30f3\u30af\u3067\u3059\u3002<br> \u3000<strong><a href=\"https:\/\/www.oji-koji.com\/pro-files\/UDPMulticastReceiverWin.zip\">UDPMulticastReceiver for Windows<\/a><\/strong><br> \u3000<strong><a href=\"https:\/\/www.oji-koji.com\/pro-files\/UDPMulticastReceiverLinux.zip\">UDPMulticastReceiver for Linux<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u56de\u306f\u3001\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u53d7\u4fe1\u30d7\u30ed\u30b0\u30e9\u30e0(UDPMulticastReceiver for Windows)\u3092\u4f5c\u308a\u307e\u3059\u3002UDPMulticastSender\u306e\u4f5c\u6210\u3067\u8a18\u8ff0\u3057\u305f\u3088\u3046\u306b\u3001\u30de\u30eb\u30c1\u30ad\u30e3\u30b9\u30c8\u30b0\u30eb\u30fc\u30d7\u3078\u306e\u300c\u53c2\u52a0\u300d\u3001\u300c\u96e2\u8131\u300d [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":129,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_locale":"ja","_original_post":"https:\/\/www.oji-koji.com\/?p=2039","footnotes":""},"categories":[10],"tags":[],"class_list":["post-2039","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-networkprograming3","ja"],"_links":{"self":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/2039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2039"}],"version-history":[{"count":25,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/2039\/revisions"}],"predecessor-version":[{"id":3119,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/2039\/revisions\/3119"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/media\/129"}],"wp:attachment":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}