ÔʼÌ×½Ó×Ö¿ÉÒÔ·ÃÎÊICMPºÍICMPµÈÐÒé°ü£¬¿ÉÒÔ¶ÁдÄں˲»´¦ÀíµÄIPÊý¾Ý°ü¡£¿ÉÒÔ´´½¨×Ô¶¨ÒåµÄIPÊý¾Ý°üÊײ¿¡£Ò»¾ä»°£¬Ê¹ÓÃÔʼÌ×½Ó×Ö¿ÉÒÔ
±àд»ùÓÚIPÐÒéµÄͨѶ³ÌÐò¡£
1.´´½¨ÔʼÌ×½Ó×Ö
¾ßÌå¸ñʽÈçÏ£º
int sockfd;
sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);
µÚÒ»¸ö²ÎÊý£ºÐÒé×å AF_INET ´ú±íTCP/IPÐÒé
µÚ¶þ¸ö²ÎÊý£ºSOCKETÀàÐÍ
µÚÈý¸ö²ÎÊý£ºÐÒéÀàÐÍ
×¢Òâ:
@Èç¹ûÖ¸¶¨ÐÒéΪ0ʱ£¬ÔʼÌ×½Ó×Ö¿ÉÒÔ½ÓÊÕÄں˴«µÝ¸øÔʼÌ×½Ó×ÖµÄÈκÎIPÊý¾Ý°ü£¬ÇÒÖ»Óг¬¼¶Óû§²Å¿ÉÒÔ´´½¨ÔʼÌ×½Ó×Ö¡£
@µ±ÐèÒª±àд×Ô¼ºµÄIPÊý¾Ý°üÊײ¿Ê±£¬¿ÉÒÔÔÚÔʼÌ×½Ó×ÖÉÏÉèÖÃÌ×½Ó×ÖÑ¡ÏîIP_HDRINCL¡£ÔÚ²»ÉèÖÃÕâ¸öÑ¡ÏîµÄÇé¿öÏ£¬IPÐÒé×Ô¶¯Ìî³äIPÊý¾Ý°üµÄÊײ¿¡£
int on = 1;
if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
{
fprintf(stderr, "setsockopt IP_HDRINCL ERROR! \n");
exit(1);
}
ÔʼÌ×½Ó×ÖÖ±½ÓʹÓÃIPÐÒéµÄÌ×½Ó×Ö£¬ËùÒÔÊÇ·ÇÃæÏòÁ¬½ÓµÄ¡£ÔÚÕâ¸öÌ×½Ó×ÖÉÏ¿ÉÒÔµ÷ÓÃconnectºÍbindº¯Êý£¬·Ö±ðÖ´Ðа󶨶Է½ºÍ±¾µØµØÖ·¡£
˵Ã÷£º
bindº¯Êý£ºµ÷ÓÃbindº¯Êýºó£¬·¢ËÍÊý¾Ý°üµÄÔ´IPµØÖ·½«ÊÇbindº¯ÊýÖ¸¶¨µÄµØÖ·¡£ÈçÊDz»µ÷ÓÃbind£¬ÔòÄں˽«ÒÔ·¢½Ó¿ÚµÄÖ÷IPµØÖ·Ìî³ä¡£Èç¹ûÉèÖÃÁËIP_HDRINCL,ÄÇô±ØÐëÊÖ¹¤Ìî³äÿ¸ö·¢ËÍÊý¾Ý°üµÄÔ´IPµØÖ·¡£
connetcº¯Êý£ºµ÷ÓÃconnectº¯Êýºó£¬¿ÉÒÔÓÃwriteºÍsend·¢ËÍÊý¾Ý°ü¡£Äں˽«ÓÃÕâ¸ö°ó¶¨µÄµØÖ·Ìî³äIPÊý¾Ý°üµÄÄ¿µÄIPµØÖ·¡£
·¢ËÍÊý¾Ý°ü
ʹÓÃÔʼÌ×½Ó×Ö·¢ËÍÊý¾Ý°ü±ØÐë×ñÑÒÔϹæÔò£º
1.Èç¹ûûÓÐÓÃconnectº¯Êý°ó¶¨¶Ô·½µØַʱ£¬ÔòӦʹÓÃsendto»òsendmsgº¯Êý·¢ËÍÊý¾Ý°ü£¬ÔÚº¯Êý²ÎÊýÖÐÖ¸¶¨¶Ô·½µØÖ·¡£Èç¹ûµ÷ÓÃÁËconnectº¯Êý£¬Ôò¿ÉÒÔÖ±½ÓʹÓÃsend,write»òwritevÀ´·¢ËÍÊý¾Ý°ü¡£
2.Èç¹ûûÓÐÉèÖÃIP_HDRINCLÑ¡Ïîʱ£¬°üÄÚ¿ÉдµÄÄÚÈÝΪÊý¾Ý²¿·Ö£¬Äں˽«×Ô¶¯´´½¨IPÊײ¿¡£Èç¹ûÉèÖÃÁËIP_HDRINCLÑ¡ÏÔò°üÄÚÒªÌî³äµÄÄÚÈÝΪIPÊý¾Ý°üºÍÊײ¿¡£ÄÚºËÖ»¸ºÔðÌî³äÏÂÃæÁ½¸öÓò£º
?Èç¹û½«IPÊý¾Ý°üµÄ±êʶÓòÉèÖÃΪ0£¬Äں˽«ÉèÖÃÕâ¸öÓò
?ÄÚºË×ÜÊǼÆËãºÍÌî³äIPÊý¾Ý°üÊײ¿µÄУÑéºÍ¡£
×¢Ò⣺IPÊý¾Ý°üÊײ¿¸÷¸öÓòµÄÄÚÈݶ¼ÊÇÍøÂç×Ö½Ú˳Ðò¡£
½ÓÊÕÊý¾Ý°ü
ÄÚºË×ñÑÒÔϹæÔò½ÓÊÕÊý¾Ý°ü£º
1.UDPºÍTCPÊý¾Ý°ü´Ó²»´«Ë͸øÒ»¸öÔʼÌ×½Ó×Ö¡£Èç¹ûÒª²é¿´ÕâÁ½ÀàÊý¾Ý°ü£¬Ö»ÄÜͨ¹ýÖ±½Ó·ÃÎÊÊý¾ÝÁ´Â·²ãÀ´ÊµÏÖ¡£
2.´ó¶àÊýICMPÊý¾Ý°üµÄÒ»¸ö¿½±´´«Ë͸øÆ¥ÅäµÄÔʼÌ×½Ó×Ö¡£
3.Äں˴¦ÀíµÄËùÓÐÆäËüÀàÐ͵ÄÊý¾Ý°üµÄÒ»¸ö¿½±´¶¼´«¸øÆ¥ÅäµÄÔʼÌ×½Ó×Ö¡£
4.ËùÓÐÄں˲»ÄÜʶ±ðµÄÐÒéÀàÐ͵ÄIPÊý¾Ý°ü¶¼´«Ë͸øÆ¥ÅäµÄÔʼÌ×½Ó×Ö¡£¶ÔÓÚÕâЩIPÊý¾Ý°ü£¬ÄÚºËÖ»×ö±ØÒªµÄ¼ìÑ鹤×÷¡£
ÔÚ½«Ò»¸öIPÊý¾Ý°ü´«Ë͸øÔʼÌ×½Ó×Ö֮ǰ£¬ÄÚºËÐèҪѡÔñÆ¥ÅäµÄÔʼÌ×½Ó×Ö
1.Êý¾Ý°üµÄÐÒéÓò±ØÐëÓë½ÓÊÕÔʼÌ×½Ó×ÖµÄÐÒéÀàÐÍÆ¥Åä¡£
2.Èç¹ûÔʼÌ×½Ó×Öµ÷ÓÃÁËbindº¯Êý°ó¶¨Á˱¾µØIPµØÖ·£¬ÄÇôµ½´ïµÄIPÊý¾Ý°üµÄÔ´IPµØÖ·±ØÐëºÍ¶Ô·½µÄIPÏàÆ¥Åä¡£
3.Èç¹ûÔʼÌ×½Ó×Öµ÷ÓÃconnectº¯ÊýÖ¸¶¨Á˶Է½µÄIPµØÖ·£¬Ôòµ½´ïµÄIPÊý¾Ý°üµÄÔ´IPµØÖ·ÃØÐëÓëÕâËüÏàͬ¡£