
×÷Õߣº¡¡·¢²¼Ê±¼ä£º2007-07-19 00:16:25¡¡À´Ô´£º µã»÷:18
IP¶à²¥£¨Ò²³Æ¶àÖ·¹ã²¥»ò×é²¥£©¼¼Êõ£¬ÊÇÒ»ÖÖÔÊÐíһ̨»ò¶ą̀Ö÷»ú£¨¶à²¥Ô´£©·¢Ë͵¥Ò»Êý¾Ý°üµ½¶ą̀Ö÷»ú£¨Ò»´ÎµÄ£¬Í¬Ê±µÄ£©µÄTCP/IPÍøÂç¼¼Êõ¡£¶à²¥×÷Ϊһµã¶Ô¶àµãµÄͨÐÅ£¬ÊǽÚÊ¡ÍøÂç´ø¿íµÄÓÐЧ·½·¨Ö®Ò»¡£ÔÚÍøÂçÒôƵ/ÊÓÆµ¹ã²¥µÄÓ¦ÓÃÖУ¬µ±ÐèÒª½«Ò»¸ö½ÚµãµÄÐźŴ«Ë͵½¶à¸ö½Úµãʱ£¬ÎÞÂÛÊDzÉÓÃÖØ¸´µã¶ÔµãͨÐÅ·½Ê½£¬»¹ÊDzÉÓù㲥·½Ê½£¬¶¼»áÑÏÖØÀË·ÑÍøÂç´ø¿í£¬Ö»Óжಥ²ÅÊÇ×îºÃµÄÑ¡Ôñ¡£¶à²¥ÄÜʹһ¸ö»ò¶à¸ö¶à²¥Ô´Ö»°ÑÊý¾Ý°ü·¢Ë͸øÌض¨µÄ¶à²¥×飬¶øÖ»ÓмÓÈë¸Ã¶à²¥×éµÄÖ÷»ú²ÅÄܽÓÊÕµ½Êý¾Ý°ü¡£Ä¿Ç°£¬IP¶à²¥¼¼Êõ±»¹ã·ºÓ¦ÓÃÔÚÍøÂçÒôƵ/ÊÓÆµ¹ã²¥¡¢AOD/VOD¡¢ÍøÂçÊÓÆµ»áÒé¡¢¶àýÌåÔ¶³Ì½ÌÓý¡¢¡°push¡±¼¼Êõ£¨Èç¹ÉƱÐÐÇéµÈ£©ºÍÐéÄâÏÖʵÓÎÏ·µÈ·½Ãæ¡£
¡¡¡¡Ò»¡¢IP¶à²¥¼¼Êõ¼ò½é
¡¡¡¡1£®IP¶à²¥µØÖ·ºÍ¶à²¥×é
¡¡¡¡IP¶à²¥Í¨ÐűØÐëÒÀÀµÓÚIP¶à²¥µØÖ·£¬ÔÚIPv4ÖÐËüÊÇÒ»¸öDÀàIPµØÖ·£¬·¶Î§´Ó224.0.0.0µ½239.255.255.255£¬²¢±»»®·ÖΪ¾Ö²¿Á´½Ó¶à²¥µØÖ·¡¢Ô¤Áô¶à²¥µØÖ·ºÍ¹ÜÀíȨÏ޶ಥµØÖ·ÈýÀà¡£ÆäÖУ¬¾Ö²¿Á´½Ó¶à²¥µØÖ··¶Î§ÔÚ224.0.0.0~224.0.0.255£¬ÕâÊÇΪ·ÓÉÐÒéºÍÆäËüÓÃ;±£ÁôµÄµØÖ·£¬Â·ÓÉÆ÷²¢²»×ª·¢ÊôÓÚ´Ë·¶Î§µÄIP°ü£»Ô¤Áô¶à²¥µØÖ·Îª224.0.1.0~238.255.255.255£¬¿ÉÓÃÓÚÈ«Çò·¶Î§£¨ÈçInternet£©»òÍøÂçÐÒ飻¹ÜÀíȨÏ޶ಥµØÖ·Îª239.0.0.0~239.255.255.255£¬¿É¹©×éÖ¯ÄÚ²¿Ê¹Óã¬ÀàËÆÓÚ˽ÓÐIPµØÖ·£¬²»ÄÜÓÃÓÚInternet£¬¿ÉÏÞÖÆ¶à²¥·¶Î§¡£
¡¡¡¡Ê¹ÓÃͬһ¸öIP¶à²¥µØÖ·½ÓÊնಥÊý¾Ý°üµÄËùÓÐÖ÷»ú¹¹³ÉÁËÒ»¸öÖ÷»ú×飬Ҳ³ÆÎª¶à²¥×é¡£Ò»¸ö¶à²¥×éµÄ³ÉÔ±ÊÇËæÊ±±ä¶¯µÄ£¬Ò»Ì¨Ö÷»ú¿ÉÒÔËæÊ±¼ÓÈë»òÀ뿪¶à²¥×飬¶à²¥×é³ÉÔ±µÄÊýÄ¿ºÍËùÔڵĵØÀíλÖÃÒ²²»ÊÜÏÞÖÆ£¬Ò»Ì¨Ö÷»úÒ²¿ÉÒÔÊôÓÚ¼¸¸ö¶à²¥×é¡£´ËÍ⣬²»ÊôÓÚijһ¸ö¶à²¥×éµÄÖ÷»úÒ²¿ÉÒÔÏò¸Ã¶à²¥×é·¢ËÍÊý¾Ý°ü¡£
¡¡¡¡2£®IP¶à²¥¼¼ÊõµÄÓ²¼þÖ§³Ö
¡¡¡¡ÒªÊµÏÖIP¶à²¥Í¨ÐÅ£¬ÒªÇó½éÓڶಥԴºÍ½ÓÊÕÕßÖ®¼äµÄ·ÓÉÆ÷¡¢¼¯Ï߯÷¡¢½»»»»úÒÔ¼°Ö÷»ú¾ùÐèÖ§³ÖIP¶à²¥¡£Ä¿Ç°£¬IP¶à²¥¼¼ÊõÒѵõ½Ó²¼þ¡¢Èí¼þ³§É̵Ĺ㷺֧³Ö¡£
¡¡¡¡£¨1£©Ö÷»ú
¡¡¡¡Ö§³ÖIP¶à²¥Í¨Ðŵį½Ì¨°üÀ¨Windows CE 2.1¡¢Windows 95¡¢Windows 98¡¢Windows NT 4ºÍWindows 2000µÈ£¬ÔËÐÐÕâЩ²Ù×÷ϵͳµÄÖ÷»ú¶¼¿ÉÒÔ½øÐÐIP¶à²¥Í¨ÐÅ¡£´ËÍ⣬ÐÂÉú²úµÄÍø¿¨Ò²¼¸ºõ¶¼ÌṩÁ˶ÔIP¶à²¥µÄÖ§³Ö¡£
¡¡¡¡£¨2£©¼¯Ï߯÷ºÍ½»»»»ú
¡¡¡¡Ä¿Ç°´ó¶àÊý¼¯Ï߯÷¡¢½»»»»úÖ»ÊǼòµ¥µØ°Ñ¶à²¥Êý¾Ýµ±³É¹ã²¥À´·¢ËͽÓÊÕ£¬µ«Ò»Ð©ÖС¢¸ßµµ½»»»»úÌṩÁ˶ÔIP¶à²¥µÄÖ§³Ö¡£ÀýÈ磬ÔÚ3COM SuperStack 3 Swith 3300½»»»»úÉÏ¿ÉÆôÓÃ802.1p»òIGMP¶à²¥¹ýÂ˹¦ÄÜ£¬Ö»ÎªÒÑÕì²âµ½IGMPÊý¾Ý°üµÄ¶Ë¿Úת·¢¶à²¥Êý¾Ý°ü¡£
¡¡¡¡£¨3£©Â·ÓÉÆ÷
¡¡¡¡¶à²¥Í¨ÐÅÒªÇó¶à²¥Ô´½ÚµãºÍÄ¿µÄ½ÚµãÖ®¼äµÄËùÓзÓÉÆ÷±ØÐëÌṩ¶ÔInternet×é¹ÜÀíÐÒ飨IGMP£©¡¢¶à²¥Â·ÓÉÐÒ飨ÈçPIM¡¢DVMRPµÈ£©µÄÖ§³Ö¡£
¡¡¡¡µ±Ò»Ì¨Ö÷»úÓû¼ÓÈëij¸ö¶à²¥×éʱ£¬»á·¢³ö¡°Ö÷»ú³ÉÔ±±¨¸æ¡±µÄIGMPÏûϢ֪ͨ¶à²¥Â·ÓÉÆ÷¡£µ±¶à²¥Â·ÓÉÆ÷½ÓÊÕµ½·¢¸øÄǸö¶à²¥×éµÄÊý¾Ýʱ£¬±ã»á½«Æäת·¢¸øËùÓеĶಥÖ÷»ú¡£¶à²¥Â·ÓÉÆ÷»¹»áÖÜÆÚÐԵط¢³ö¡°Ö÷»ú³ÉÔ±²éѯ¡±µÄIGMPÏûÏ¢£¬Ïò×ÓÍø²éѯ¶à²¥Ö÷»ú£¬Èô·¢ÏÖij¸ö¶à²¥×éÒÑûÓÐÈκγÉÔ±£¬Ôòֹͣת·¢¸Ã¶à²¥×éµÄÊý¾Ý¡£´ËÍ⣬µ±Ö§³ÖIGMP v2µÄÖ÷»ú£¨Èç£×indows 98/2000¼ÆËã»ú£©Í˳öij¸ö¶à²¥×éʱ£¬»¹»áÏò·ÓÉÆ÷·¢ËÍÒ»Ìõ¡°À뿪×顱µÄIGMPÏûÏ¢£¬ÒÔ֪ͨ·ÓÉÆ÷ֹͣת·¢¸Ã¶à²¥×éµÄÊý¾Ý¡£µ«Ö»Óе±×ÓÍøÉÏËùÓÐÖ÷»ú¶¼Í˳öij¸ö¶à²¥×éʱ£¬Â·ÓÉÆ÷²Å»áÍ£Ö¹Ïò¸Ã×ÓÍø×ª·¢¸Ã¶à²¥×éµÄÊý¾Ý¡£
¡¡¡¡Ê¹Óöಥ·ÓÉÐÒ飬·ÓÉÆ÷¿É½¨Á¢Æð´Ó¶à²¥Ô´½Úµãµ½ËùÓÐÄ¿µÄ½ÚµãµÄ¶à²¥Â·ÓÉ±í£¬´Ó¶øÊµÏÖÔÚ×ÓÍø¼äת·¢¶à²¥Êý¾Ý°ü¡£ÀýÈ磬PIM£¨ÐÒé¶ÀÁ¢¶à²¥£©¾ÍÊÇÒ»Öֶಥ·ÓÉÐÒ飬ËüÓÐÁ½ÖÖÀàÐÍ£ºÏ¡Êèģʽ£¨sparse-mode£©ºÍÃܼ¯Ä£Ê½£¨dense-mode£©¡£ÒÔCisco 2621·ÓÉÆ÷ΪÀý£¬ÆôÓÃIP¶à²¥×ª·¢¹¦ÄܵĻù±¾ÉèÖÃÈçÏ£º
¡¡¡¡c2621(config)# ip multicast-routing Æô¶¯IP¶à²¥£¬Ê¹Â·ÓÉÆ÷³ÉΪһ¸ö¶à²¥Â·ÓÉÆ÷
¡¡¡¡c2621(config)# int f0/0 ÅäÖÿìËÙÒÔÌ«Íø¶Ë¿Ú0
¡¡¡¡c2621(config-if)# ip pim dense-mode£¨»òsparse-mode£©Æô¶¯PIM£¬Í¬Ê±¼¤»îIGMPÐÒé
¡¡¡¡c2621(config-if)# int f0/1 ÅäÖÿìËÙÒÔÌ«Íø¶Ë¿Ú£±
¡¡¡¡c2621(config-if)# ip pim dense-mode£¨»òsparse-mode£©
¡¡¡¡¶þ¡¢IP¶à²¥Ó¦Óõıà³Ì·½·¨
¡¡¡¡ÔÚʵ¼ÊÓ¦ÓÃÖУ¬±à³ÌÈËԱͨ³£ÐèÒª×Ô¼º±àÖÆµ×²ãÍøÂçÓ¦ÓóÌÐòÀ´ÊµÏÖÍøÉϵĵײãͨÐÅ£¬Èç¾ßÌåʵÏÖIP¶à²¥Í¨ÐŵŦÄÜ¡£±àÖÆµ×²ãÍøÂçÓ¦ÓóÌÐòͨ³£Òª½èÖúÓÚÍøÂçÊý¾ÝͨÐűà³Ì½Ó¿Ú£¬¶øÔÚ²»Í¬µÄ²Ù×÷ϵͳÖÐËùÌṩµÄÍøÂç±à³Ì½Ó¿ÚÊÇÓÐËù²»Í¬µÄ£¬ÈçÔÚMicrosoft Windows»·¾³ÏµÄÍøÂç±à³Ì½Ó¿Ú¾ÍÊÇWindowsÌ×½Ó×Ö£¨Windows Socket£¬¼ò³ÆWinsock£©¡£
¡¡¡¡WinsockÌṩÁ˰üÀ¨TCP/IP¡¢IPXµÈ¶àÖÖͨÐÅÐÒéϵıà³Ì½Ó¿Ú¡£²»Í¬µÄWindows°æ±¾Ö§³Ö²»Í¬µÄWinsock°æ±¾£¬ÆäÖÐWindows 95µÈÔçÆÚ°æ±¾±¾ÉíÖ»Ö§³ÖWinsock1.1£¨16λ£©Ïµıà³Ì£¨¿ÉÒÔͨ¹ý°²×°Ïà¹ØµÄÈí¼þ°üʹÆäÖ§³ÖWinsock2.0£©£¬¶øWindows98¡¢Windows NT4.0¡¢Windows 2000ÔòÖ±½ÓÖ§³ÖWinsock2.0£¨32룩¡£Winsock2.0ÊÇWinsock1.1µÄÀ©Õ¹£¬³ý¼æÈÝWinsock1.1 APIÍ⣬»¹¶¨ÒåÁËÒ»Ì׿ÉÖ§³ÖIP¶à²¥µÄÓëÐÒéÎ޹صÄAPI¡£
¡¡¡¡Ê¹ÓÃWinsock 2.0ʵÏÖIP¶à²¥µÄÒ»°ã²½ÖèÈçÏ£º
¡¡¡¡1£®³õʼ»¯Winsock×ÊÔ´
¡¡¡¡ÔÚʹÓÃWinsock֮ǰ£¬±ØÐëµ÷ÓÃWSAStartup()º¯Êý³õʼ»¯Windows Sockets DLL¡£ËüÔÊÐíÓ¦ÓóÌÐò»òDLLÖ¸¶¨Windows Sockets APIÒªÇóµÄ°æ±¾¡£
¡¡¡¡2£®´´½¨Ì×½Ó×Ö
¡¡¡¡µ÷ÓÃWSASocket()º¯Êý¿ÉÒÔ´´½¨Ò»¸öʹÓÃUDPÐÒéµÄÌ×½Ó×Ö£¬ËüÊǼÓÈë¶à²¥×éµÄ³õʼ»¯Ì×½Ó×Ö£¬²¢ÇÒÒÔºóÊý¾ÝµÄ·¢ËͺͽÓÊÕ¶¼ÔÚ¸ÃÌ×½Ó×ÖÉϽøÐС£Õë¶ÔIP¶à²¥Í¨ÐÅ£¬¿É½«²ÎÊýdwFlagsÉèÖÃΪWSA_FLAG_MULTIPOINT_C_LEAF¡¢WSA_FLAG_MULTIPOINT_D_LEAFºÍWSA_FLAG_OVERLAPPEDµÄλºÍ£¬Ö¸Ã÷IP¶à²¥Í¨ÐÅÔÚ¿ØÖƲãÃæºÍÊý¾Ý²ãÃæ¶¼ÊÇ¡°ÎÞ¸ùµÄ¡±£¬Ö»´æÔÚÒ¶½Úµã£¬ËüÃÇ¿ÉÒÔÈÎÒâ¼ÓÈëÒ»¸ö¶à²¥×飬¶øÇÒ´ÓÒ»¸öÒ¶½Úµã·¢Ë͵ÄÊý¾Ý»á´«Ë͵½Ã¿Ò»¸öÒ¶½Úµã£¨°üÀ¨Ëü×Ô¼º£©£»´´½¨µÄÌ×½Ó×Ö¾ßÓÐÖØµþÊôÐÔ¡£
¡¡¡¡3£®ÉèÖÃÌ×½Ó×ÖµÄÑ¡Ïî
¡¡¡¡µ÷ÓÃsetsockopt()º¯ÊýΪÌ×½Ó×ÖÉèÖÃSO_REUSEADDRÑ¡ÏÒÔÔÊÐíÌ×½Ó×Ö°óÔúµ½Ò»¸öÒÑÔÚʹÓõĵØÖ·ÉÏ¡£
¡¡¡¡4£®°ó¶¨Ì×½Ó×Ö
¡¡¡¡µ÷ÓÃbind()º¯Êý°ó¶¨Ì×½Ó×Ö£¬´Ó¶ø½«´´½¨ºÃµÄÌ×½Ó×ÖÓë±¾µØµØÖ·ºÍ±¾µØ¶Ë¿ÚÁªÏµÆðÀ´¡£¶ÔÓڶಥͨÐÅÀ´Ëµ£¬·¢ËͺͽÓÊÕÊý¾Ýͨ³£²ÉÓÃͬһ¸ö¶Ë¿Ú¡£
¡¡¡¡ 5£®ÉèÖöಥÌ×½Ó×ÖµÄģʽ
¡¡¡¡WSAIoctl()º¯ÊýµÄÃüÁîÂëSIO_MULTICAST_LOOPÓÃÀ´ÔÊÐí»ò½ûÖ¹¶à²¥Í¨ÐÅʱ·¢ËͳöÈ¥µÄͨÐÅÁ÷Á¿ÊÇ·ñÒ²Äܹ»ÔÚͬһ¸öÌ×½Ó×ÖÉϱ»½ÓÊÕ£¨¼´¶à²¥·µ»Ø£©¡£ÖµµÃ×¢ÒâµÄÊÇ£¬ÔÚWindows 95/98/NT 4ÖУ¬Ä¬ÈÏÊÇÔÊÐí¶à²¥·µ»Ø£¬µ«²»ÄÜÉèÖýûÖ¹£¬·ñÔò»á³ö´í£»Ö»ÓÐÔÚWindows 2000ÒÔÉϰ汾ÖУ¬²ÅÄÜÉèÖÃÔÊÐí/½ûÖ¹¶à²¥·µ»Ø¡£
¡¡¡¡WSAIoctl()º¯ÊýµÄÃüÁîÂëSIO_MULTICAST_SCOPEÓÃÀ´ÉèÖöಥ´«²¥µÄ·¶Î§£¬¼´Éú´æÊ±¼äTTL¡£Ã¿µ±¶à²¥Â·ÓÉÆ÷ת·¢¶à²¥Êý¾Ý°üʱ£¬Êý¾Ý°üÖеÄTTLÖµ¶¼»á±»¼õ1£¬ÈôÊý¾Ý°üµÄTTL¼õÉÙµ½0£¬Ôò·ÓÉÆ÷½«Åׯú¸ÃÊý¾Ý°ü¡£TTLµÄÖµÊǶàÉÙ£¬¶à²¥Êý¾Ý±ã×î¶àÄܾ¹ý¶àÉÙ¸ö¶à²¥Â·ÓÉÆ÷¡£ÀýÈ磬TTLֵΪ0£¬Ôò¶à²¥Ö»ÄÜÔÚ±¾µØÖ÷»úµÄ¶à¸öÌ×½Ó×ּ䴫²¥£¬¶ø²»ÄÜ´«²¥µ½¡°ÍøÏß¡±ÉÏ£»TTLֵΪ1£¨Ä¬ÈÏÖµ£©£¬Ôò¶à²¥Êý¾ÝÓöµ½µÚÒ»¸ö·ÓÉÆ÷£¬±ã»á±»Ëü¡°ÎÞÇ顱µØ¶ªÆú£¬²»ÔÊÐí´«³ö±¾µØÍøÂçÖ®Í⣬¼´Ö»ÓÐͬһ¸öÍøÂçÄڵĶಥ×é³ÉÔ±²ÅÄÜÊÕµ½¶à²¥Êý¾Ý¡£
¡¡¡¡6£®¼ÓÈëÒ»¸ö¶à²¥×é
¡¡¡¡µ÷ÓÃWSAJoinLeaf()º¯Êý¿É¼ÓÈëÒ»¸ö¶à²¥×é²¢Ö¸¶¨½ÇÉ«£¨·¢ËÍÕß/½ÓÊÕÕߣ©¡£µ÷ÓÃʱ£¬²ÎÊýdwFlags¿ÉÖ¸¶¨Ì×½Ó×Ö×÷Ϊ·¢ËÍÕߣ¨JL_SENDER_ONLY£©¡¢½ÓÊÕÕߣ¨JL_RECEIVER_ONLY£©»òÉí¼æÁ½Õߣ¨JL_BOTH£©¡£µ÷Óóɹ¦ºó»á·µ»ØÒ»¸ö¶à²¥Ì×½Ó×Ö£¬µ÷ÓÃclosesocket()º¯Êý¹Ø±Õ¸ÃÌ×½Ó×Ö¾ÍÀ뿪Á˶ಥ×飬´Ëʱ¿ÉÒÔµ÷ÓÃWSAJoinLeaf()º¯ÊýÔٴμÓÈë¶à²¥×é¡£×¢Ò⣬¶Ô¶à²¥×éÊý¾ÝµÄ½ÓÊպͷ¢ËͲ»ÄÜÔÚ¸ÃÌ×½Ó×ÖÉÏÍê³É¡£
¡¡¡¡7£®Ïò¶à²¥×é·¢ËÍÊý¾Ý
¡¡¡¡µ÷ÓÃsendto()º¯Êý£¬¿ÉÔÚÖ¸¶¨µÄUDPÌ×½Ó×ÖÉÏÏòÖ¸¶¨µÄ¶à²¥×é·¢ËͶಥÊý¾Ý¡£µ÷ÓÃʱ£¬²ÎÊýtoÓ¦Ö¸Ïò¶à²¥×éµÄIPµØÖ·¡£ÖµµÃ×¢ÒâµÄÊÇ£¬ÈôÒ»¸öÓ¦ÓóÌÐòÖ»ÊÇ´òËã¸ø¶à²¥×é·¢ËÍÊý¾Ý£¬±ã²»±Ø¼ÓÈëÒ»¸ö¶à²¥×é¡£
¡¡¡¡8£®µÈ´ýʼþ
¡¡¡¡µ÷ÓÃWSAAsyncSelect()º¯Êý£¬Ê¹Ì×½Ó×ÖÖÃÓÚ·Ç×èÈûģʽ£¬ÕâʱӦÓóÌÐò¾Í¿ÉÔÚ¸ÃÌ×½Ó×ÖÉϽÓÊÕÒÔWindowsÏûϢΪ»ù´¡µÄÍøÂçʼþ֪ͨ¡£ÀýÈ磬Èô²ÎÊýlEventֵΪFD_READ£¬ÔòÓ¦ÓóÌÐò¿ÉÔÚÌ×½Ó×ÖÉϽÓÊÕµ½¡°Êý¾ÝÕýµÈ´ý±»¶ÁÈ롱µÄ֪ͨ¡£
¡¡¡¡9£®´Ó¶à²¥×é½ÓÊÕÊý¾Ý
¡¡¡¡µ÷ÓÃrecvfromº¯Êý£¬¿ÉÔÚÖ¸¶¨µÄUDPÌ×½Ó×ÖÉ϶ÁÈ¡ÊäÈëÊý¾Ý¡£¶à²¥Í¨ÐÅÖÐÊý¾ÝµÄ·¢ËÍÓë½ÓÊÕÒ»°ã²ÉÓÃͬһ¸ö¶Ë¿Ú£¬Òò´ËÆä·¢ËÍÌ×½Ó×ֺͽÓÊÕÌ×½Ó×ÖÊÇÒ»ÑùµÄ¡£
¡¡¡¡10£®¹Ø±ÕÌ×½Ó×Ö£¬ÊÍ·ÅWinsock×ÊÔ´¡£
¡¡¡¡ÔڶಥͨÐŽáÊøºó£¬Ïȵ÷ÓÃclosesocket()º¯Êý¹Ø±Õ¶à²¥Ì×½Ó×ÖºÍUDPÌ×½Ó×Ö£¬È»ºóµ÷ÓÃWSACleanup()º¯Êý½áÊø¶ÔWindows Sockets DLLµÄʹÓá£
¡¡¡¡Èý¡¢Ó¦ÓÃʵÀý
¡¡¡¡ÎªÁË˵Ã÷IP¶à²¥¼¼ÊõµÄÓ¦Ó÷½·¨£¬±¾ÈËÔÚVisual C++.NET»·¾³ÏÂÉè¼ÆÁËÒ»¸ö¼òµ¥µÄ»ùÓÚWindows Socket 2µÄIP¶à²¥Ó¦ÓóÌÐò£¬Í¨¹ý¸ÃÀý×Ó¶ÁÕß¿ÉÒÔÕÆÎÕIP¶à²¥Ó¦ÓóÌÐòÉè¼ÆµÄÒ»°ã·½·¨¡£¸Ã³ÌÐòµÄ¾ßÌåÉè¼Æ·½·¨ÈçÏ£º
¡¡¡¡1£®ÔÚVisual Studio.NETÖн¨Á¢Ò»¸ö»ùÓÚ¶Ô»°¿òµÄMFCÏîÄ¿CMulticastSocket¡£×¢ÒâÔÚ¡°¸ß¼¶¹¦ÄÜ¡±ÉèÖÃÖв»ÒªÑ¡Ôñ¡°WindowsÌ×½Ó×Ö¡±£¬ÕâÊÇÒòΪMFCÖ»Ö§³ÖWindows Socket 1¶ø²»Ö§³ÖWindows Socket 2¡£ÎªÁËÄÜʹÓÃWinsock 2 API±à³Ì£¬ÔÚ³ÌÐòÖÐÓ¦°üº¬¡°winsock2.h¡±Í·Îļþ£¬²¢ÔÚÏîÄ¿ÖмÓÈëws2_32.libµÄ¾²Ì¬¿â£¬¸Ã¾²Ì¬¿âÓ¦ÉèÖÃÔÚÏîÄ¿ÊôÐԵġ°Á´½ÓÆ÷¡±/¡°ÊäÈ롱/¡°¸½¼ÓÒÀÀµÏÖС£
¡¡¡¡2£®ÔÚ¶Ô»°¿ò£¨ÀàÃûCCMulticastSocketDlg£©×ÊÔ´ÖУ¬ÉèÖÃËüµÄCaptionΪ¡°WinSock 2¶à²¥Ó¦ÓóÌÐò¡±£¬²¢Ìí¼ÓÒÔÏ¿ؼþ£º
¡¡¡¡¾²Ì¬Îı¾£ºCaptionΪ¡°½ÓÊÕµ½µÄÐÅÏ¢£º¡±£»
¡¡¡¡±à¼¿ò£ºIDΪIDC_RECEIVE_EDIT£¬Read Only¡¢Auto Vscroll¡¢Vertical ScrollºÍMultilineÊôÐÔÖµ¶¼ÎªTrue
¡¡¡¡
¡¡¡¡¾²Ì¬Îı¾£ºCaptionΪ¡°·¢Ë͵ÄÐÅÏ¢£º¡±
¡¡¡¡
¡¡¡¡±à¼¿ò£ºIDΪIDC_SEND_EDIT
¡¡¡¡µÚÒ»¸ö°´Å¥£ºCaptionΪ¡°¼ÓÈë¶à²¥×é(&J)¡±£¬IDΪIDC_JOIN_BUTTON
¡¡¡¡
¡¡¡¡µÚ¶þ¸ö°´Å¥£ºCaptionΪ¡°¶à²¥·¢ËÍ(&S)¡±£¬IDΪIDC_SEND_BUTTON
¡¡¡¡µÚÈý¸ö°´Å¥£ºCaptionΪ¡°À뿪¶à²¥×é(&L)¡±£¬IDΪIDC_LEAVE_BUTTON
¡¡¡¡µÚËĸö°´Å¥£ºCaptionΪ¡°Í˳ö(&Q)¡±£¬IDΪIDC_QUIT_BUTTON ΪÁ½¸ö±à¼¿ò·Ö±ðÌí¼ÓÏà¹ØÁªµÄCStringÀàÐ͵ıäÁ¿m_SendMessageºÍm_ReceiveMessage£»
¡¡¡¡ÎªËĸö°´Å¥Ìí¼ÓÏàÓ¦µÄÏûÏ¢´¦Àíº¯Êý£»Îª¶Ô»°¿òÌí¼Ó¶¨Ê±Æ÷ÏûÏ¢£¨ÓÃÓÚ¶¨Ê±ÏÔʾ½ÓÊÕµ½µÄÏûÏ¢£©¼°ÆäÏûÏ¢´¦Àíº¯Êý¡£
¡¡¡¡3£®Ìí¼ÓÒ»¸öеĶԻ°¿ò×ÊÔ´£¬ÉèÖÃËüµÄCaptionΪ¡°¼ÓÈë¶à²¥×顱£¬±£ÁôĬÈϵÄÁ½¸ö°´Å¥¿Ø¼þ£¬Í¬Ê±Ìí¼ÓÌí¼ÓÒÔÏ¿ؼþ£º
¡¡¡¡¾²Ì¬Îı¾£ºCaptionΪ¡°IP¶à²¥×鵨ַ£º¡±
¡¡¡¡±à¼¿ò£ºIDΪIDC_IPADDRESS_EDIT
¡¡¡¡¾²Ì¬Îı¾£ºCaptionΪ¡°IP¶à²¥¶Ë¿Ú£º¡±
¡¡¡¡±à¼¿ò£ºIDΪIDC_PORT_EDIT ¾²Ì¬Îı¾£ºCaptionΪ¡°Éú´æÊ±¼ä£º¡±
¡¡¡¡±à¼¿ò£ºIDΪIDC_TTL_EDIT
¡¡¡¡¸´Ñ¡¿ò£ºCaptionΪ¡°¶à²¥·µ»Ø£º¡±£¬IDΪIDC_LOOPBACK_CHECK£¬Left TextÊôÐÔֵΪTrue¡£
¡¡¡¡Îª¸Ã¶Ô»°¿òÌí¼ÓеÄÀàCJoinGroupDlg£¬ËüµÄ»ùÀàΪCDialog£¬È»ºóΪ¸Ã¶Ô»°¿òÖеÄÈý¸ö±à¼¿ò·Ö±ðÌí¼ÓÏà¹ØÁªµÄ±äÁ¿£¬¼´CSting m_IPAddress¡¢UINT m_nPort¡¢UINT m_nTTL£»Îª¸´Ñ¡¿òÌí¼ÓÏà¹ØÁªµÄBOOLÀàÐ͵ıäÁ¿m_Loopback¡£
¡¡¡¡4£®ÔÚCMulticastSocketDlg.hÎļþµÄÇ°ÃæÌí¼ÓCJoinGroupDlgµÄÍ·Îļþ£º#include ¡°JoinGroupDlg.h¡±£¬²¢ÔÚCCMulticastSocketDlgÀàÖÐÌí¼ÓÁËÒ»¸öCJoinGroupDlgÀàʵÀý¶ÔÏóm_JoinDlg¡£
¡¡¡¡5£®ÎªÁËÄÜÔÚ¶Ô»°¿òÖнÓÊÕÍøÂçʼþ֪ͨ£¬Ó¦Ôö¼ÓÒ»¸öÓû§×Ô¶¨ÒåµÄÏûÏ¢¼°ÏûÏ¢´¦Àíº¯Êý£¬¾ßÌåʵÏÖ·½·¨ÈçÏ£ºÔÚCMulticastSocketDlg.hÎļþµÄÇ°Ãæ×Ô¶¨ÒåÏûÏ¢£º#define WM_SOCK_MSG(WM_USER+166)£¬²¢ÔÚafx_msg¿éÖÐ˵Ã÷ÏûÏ¢´¦Àíº¯Êý£ºafx_msg LRESULT OnSocketMsg (WPARAM wParam,LPARAM lParam)£»ÔÚCMulticastSocketDlg.cppÎļþÖеÄÏûÏ¢Ó³Éä¿éÖУ¬Ê¹ÓÃON_MESSAGE (WM_SOCK_MSG,OnSocketMsg)ºêÖ¸ÁÏûÏ¢Ó³Éäµ½ÏûÏ¢´¦Àíº¯ÊýÖУ¬²¢¾ßÌåʵÏÖÏûÏ¢´¦Àíº¯Êý£ºLRESULT CCMulticastSocketDlg:: OnSocketMsg(WPARAM wParam,LPARAM lParam){¡}¡£
¡¡¡¡¸Ã³ÌÐòµÄÖ÷Òª´úÂë¿É²Î¼û³ÌÐòÇåµ¥£¬Ïà¹Øº¯ÊýµÄÏêϸ˵Ã÷¿É²Î¿´Microsoft MSDN°ïÖúϵͳ¡£ÎªÁ˽Úʡƪ·ù£¬³ÌÐòÖÐÊ¡ÂÔÁ˲¿·Ö×Ô¶¯Éú³ÉµÄºÍÓÃÓÚ´íÎó´¦ÀíµÄ´úÂë¡£
¡¡¡¡³ÌÐòÇåµ¥£º
¡¡¡¡// CMulticastSocketDlg.cpp : ʵÏÖÎļþ
¡¡¡¡#include "stdafx.h"
¡¡¡¡#include "winsock2.h"
¡¡¡¡#include "CMulticastSocket.h"
¡¡¡¡#include "CMulticastSocketDlg.h"
¡¡¡¡¡¡
¡¡¡¡DWORD cbRet;
¡¡¡¡SOCKET Sock,SockM; //UDPÌ×½Ó×Ö£¬¶à²¥Ì×½Ó×Ö
¡¡¡¡BOOL bFlag,bJoin;
¡¡¡¡SOCKADDR_IN local,Remote,From; //·Ö±ðÖ¸Ïò±¾µØ¡¢¶à²¥×éºÍÊý¾ÝÀ´Ô´µÄIPµØÖ·Óë¶Ë¿Ú
¡¡¡¡int Fromlen;
¡¡¡¡char ReceiveBuf[32000]; //½ÓÊÕ»º³åÇø
¡¡¡¡BOOL bDataReceived;
¡¡¡¡¡¡
¡¡¡¡BEGIN_MESSAGE_MAP(CCMulticastSocketDlg, CDialog)
¡¡¡¡¡¡
¡¡¡¡ON_BN_CLICKED(IDC_JOIN_BUTTON, OnBnClickedJoinButton)
¡¡¡¡ON_BN_CLICKED(IDC_LEAVE_BUTTON, OnBnClickedLeaveButton)
¡¡¡¡ON_BN_CLICKED(IDC_QUIT_BUTTON, OnBnClickedQuitButton)
¡¡¡¡ON_BN_CLICKED(IDC_SEND_BUTTON, OnBnClickedSendButton)
¡¡¡¡ON_WM_TIMER()
¡¡¡¡ON_MESSAGE(WM_SOCK_MSG,OnSocketMsg)
¡¡¡¡END_MESSAGE_MAP()
¡¡¡¡BOOL CCMulticastSocketDlg::OnInitDialog()
¡¡¡¡{
¡¡¡¡CDialog::OnInitDialog();
¡¡¡¡¡¡
¡¡¡¡SetTimer(1,100,NULL); //ÉèÖö¨Ê±Æ÷
¡¡¡¡Fromlen=sizeof(From);
¡¡¡¡bDataReceived=TRUE;
¡¡¡¡bJoin=FALSE; return TRUE; // ³ý·ÇÉèÖÃÁ˿ؼþµÄ½¹µã£¬·ñÔò·µ»Ø TRUE
¡¡¡¡}
¡¡¡¡¡¡
¡¡¡¡void CCMulticastSocketDlg::OnBnClickedJoinButton() //¼ÓÈë¶à²¥×é
¡¡¡¡{
¡¡¡¡if(m_JoinDlg.DoModal()==IDOK)
¡¡¡¡{
¡¡¡¡WORD wVersionRequested;
¡¡¡¡WSADATA wsaData;
¡¡¡¡int err;
¡¡¡¡wVersionRequested = MAKEWORD(2,2);
¡¡¡¡err = WSAStartup(wVersionRequested, &wsaData); //³õʼ»¯WinSock2×ÊÔ´
¡¡¡¡if(err!= 0){
¡¡¡¡AfxMessageBox("²»ÄܼÓÔØWindowsÌ×½Ó×Ö¶¯Ì¬Á´½Ó¿â,MB_OK");
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡if (LOBYTE(wsaData.wVersion) !=2 || HIBYTE(wsaData.wVersion) !=2){
¡¡¡¡AfxMessageBox("WinSock DLL²»Ö§³Ö2.0°æ±¾,MB_OK");
¡¡¡¡WSACleanup( );
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡//´´½¨Ò»¸öÌ×½Ó×Ö
¡¡¡¡Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,
¡¡¡¡(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED
¡¡¡¡| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
¡¡¡¡bFlag=TRUE; //ÉèÖÃÌ×½Ó×ÖÑ¡ÏʹÌ×½Ó×ÖΪ¿ÉÖØÓö˿ڵØÖ·
¡¡¡¡setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag));
¡¡¡¡//½«Ì×½Ó×ְ󶨵½Óû§Ö¸¶¨¶Ë¿Ú¼°Ä¬ÈϵĽӿÚ
¡¡¡¡memset(&local,0,sizeof(local));
¡¡¡¡local.sin_family=AF_INET;
¡¡¡¡local.sin_port=htons((USHORT)m_JoinDlg.m_nPort);
¡¡¡¡local.sin_addr.s_addr=htonl(INADDR_ANY);
¡¡¡¡bind(Sock,(struct sockaddr FAR *)&local,sizeof(local));
¡¡¡¡//ÉèÖöಥÊý¾Ý±¨´«²¥·¶Î§£¨Éú´æÊ±¼äTTL£©
¡¡¡¡WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&m_JoinDlg.m_nTTL,sizeof(int),
¡¡¡¡NULL,0,&cbRet,NULL,NULL);
¡¡¡¡//ÉèÖöಥ·µ»Ø£¨LOOKBACK£©
¡¡¡¡BOOL nLoopBack=m_JoinDlg.m_Loopback;
¡¡¡¡WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack),
¡¡¡¡NULL,0,&cbRet,NULL,NULL);
¡¡¡¡memset(&Remote,0,sizeof(Remote));
¡¡¡¡Remote.sin_family=AF_INET;
¡¡¡¡Remote.sin_addr.s_addr=inet_addr(m_JoinDlg.m_IPAddress);
¡¡¡¡Remote.sin_port=htons(m_JoinDlg.m_nPort);
¡¡¡¡//¼ÓÈëµ½Ö¸¶¨µÄ¶à²¥×飬²¢Ö¸¶¨Îª¼È×÷Ϊ·¢ËÍÕßÓÖ×÷Ϊ½ÓÊÕÕߣ¨JL_BOTH£©
¡¡¡¡SockM=WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),
¡¡¡¡NULL,NULL,NULL,NULL,JL_BOTH);
¡¡¡¡WSAAsyncSelect(Sock,m_hWnd,WM_SOCK_MSG,FD_READ); //×¢²áÍøÂçÏûÏ¢¼°ÆäÍøÂçʼþ
¡¡¡¡bJoin=TRUE;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡void CCMulticastSocketDlg::OnBnClickedSendButton()
¡¡¡¡//¶à²¥·¢ËÍ
¡¡¡¡{
¡¡¡¡if(bJoin)¡¡{
¡¡¡¡UpdateData(TRUE);
¡¡¡¡const char* strMessage=LPCTSTR(m_SendMessage);
¡¡¡¡int nSize=m_SendMessage.GetLength()+1;
¡¡¡¡sendto(Sock,strMessage,nSize,0,(sockaddr*)&Remote,sizeof(Remote));
¡¡¡¡}
¡¡¡¡else
¡¡¡¡AfxMessageBox("ÇëÏȼÓÈë¶à²¥×飡");
¡¡¡¡m_SendMessage="";
¡¡¡¡UpdateData(FALSE);
¡¡¡¡}
¡¡¡¡void CCMulticastSocketDlg::OnBnClickedLeaveButton()
¡¡¡¡{ //À뿪¶à²¥×é
¡¡¡¡closesocket(SockM);
¡¡¡¡closesocket(Sock);
¡¡¡¡WSACleanup();
¡¡¡¡m_SendMessage="";
¡¡¡¡m_ReceiveMessage="";
¡¡¡¡bDataReceived=TRUE;
¡¡¡¡bJoin=FALSE;
¡¡¡¡UpdateData(FALSE);
¡¡¡¡}
¡¡¡¡void CCMulticastSocketDlg::OnBnClickedQuitButton()
¡¡¡¡{ //Í˳ö
¡¡¡¡DestroyWindow();
¡¡¡¡}
¡¡¡¡void CCMulticastSocketDlg::OnTimer(UINT nIDEvent) //¶¨Ê±Æ÷´¦Àíº¯Êý£¬ÊµÏÖ½ÓÊÕÐÅÏ¢µÄ¶¨Ê±¸üÐÂ
¡¡¡¡{
¡¡¡¡if(bDataReceived)
¡¡¡¡{ m_ReceiveMessage+=ReceiveBuf;
¡¡¡¡m_ReceiveMessage+="/r/n";
¡¡¡¡bDataReceived=FALSE;
¡¡¡¡UpdateData(FALSE);
¡¡¡¡}
¡¡¡¡CDialog::OnTimer(nIDEvent);
¡¡¡¡}
¡¡¡¡LRESULT CCMulticastSocketDlg::OnSocketMsg(WPARAM wParam,LPARAM lParam)
¡¡¡¡{
¡¡¡¡//¼ìË÷ÍøÂçʼþ
¡¡¡¡switch(WSAGETSELECTEVENT(lParam))¡¡{
¡¡¡¡case FD_READ:
¡¡¡¡recvfrom(Sock,ReceiveBuf,32000,0,(sockaddr *)&From,&Fromlen);
¡¡¡¡bDataReceived=TRUE; //ÉèÖÃÒѽÓÊÕµ½Ò»ÌõÐÅÏ¢±êÖ¾
¡¡¡¡break;
¡¡¡¡}
¡¡¡¡return TRUE;
¡¡¡¡}