ÔʼÌ×½Ó×Ö£¬¼´rawsocket£¬¿ÉÒÔ½ÓÊÕ±¾»úÍø¿¨ÉϵÄÊý¾ÝÖ¡»òÕßÊý¾Ý°ü,¶ÔÓë¼àÌýÍøÂçµÄÁ÷Á¿ºÍ·ÖÎöÊǺÜÓÐ×÷ÓõÄ.Ò»¹²¿ÉÒÔÓÐ3ÖÖ·½Ê½´´½¨ÕâÖÖsocket¡¡¡¡1.socket(AF_INET,SOCK_RAW,IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)·¢ËͽÓÊÕipÊý¾Ý°ü¡¡¡¡2.socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))·¢ËͽÓÊÕÒÔÌ«ÍøÊý¾ÝÖ¡¡¡¡¡3.socket(AF_INET,SOCK_PACKET,htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))¹ýʱÁË,²»ÒªÓð¡¡¡¡¡Àí½âÒ»ÏÂSOCK_RAWµÄÔÀí,±ÈÈçÍø¿¨ÊÕµ½ÁËÒ»¸ö14+20+8+100+4µÄudpµÄÒÔÌ«ÍøÊý¾ÝÖ¡.¡¡¡¡Ê×ÏÈ,Íø¿¨¶Ô¸ÃÊý¾ÝÖ¡½øÐÐÓ²¹ýÂË(¸ù¾ÝÍø¿¨µÄģʽ²»Í¬»áÓв»Í¬µÄ¶¯×÷,Èç¹ûÉèÖÃÁËpromisc»ìÔÓģʽµÄ»°,Ôò²»×öÈκιýÂËÖ±½Ó½»¸øÏÂÒ»²ãÊäÈëÀý³Ì,·ñÔò·Ç±¾»úmac»òÕ߹㲥mac»á±»Ö±½Ó¶ªÆú).°´ÕÕÉÏÃæµÄÀý×Ó,Èç¹û³É¹¦µÄ»°,»á½øÈëipÊäÈëÀý³Ì.µ«ÊÇÔÚ½øÈëipÊäÈëÀý³Ì֮ǰ,ϵͳ»á¼ì²éϵͳÖÐÊÇ·ñÓÐͨ¹ýsocket(AF_PACKET,SOCK_RAW,..)´´½¨µÄÌ×½Ó×Ö.Èç¹ûÓеĻ°²¢ÇÒÐÒéÏà·û,ÔÚÕâ¸öÀý×ÓÖоÍÊÇÐèÒªETH_P_IP»òÕßETH_P_ALLÀàÐÍ.ϵͳ¾Í¸øÿ¸öÕâÑùµÄsocket½ÓÊÕ»º³åÇø·¢ËÍÒ»¸öÊý¾ÝÖ¡¿½±´.È»ºó½øÈëÏÂÒ»²½.¡¡¡¡Æä´Î,½øÈëÁËipÊäÈëÀý³Ì(ip²ã»á¶Ô¸ÃÊý¾Ý°ü½øÐÐÈí¹ýÂË,¾ÍÊǼì²éУÑé»òÕ߶ªÆú·Ç±¾»úip»òÕ߹㲥ipµÄÊý¾Ý°üµÈ,¾ßÌåÒª²Î¿¼Ô´´úÂë),Àý×ÓÖоÍÊÇÈç¹û³É¹¦µÄ»°»á½øÈëudpÊäÈëÀý³Ì.µ«ÊÇÔÚ½»¸øudpÊäÈëÀý³Ì֮ǰ,ϵͳ»á¼ì²éϵͳÖÐÊÇ·ñÓÐͨ¹ýsocket(AF_INET,SOCK_RAW,..)´´½¨µÄÌ×½Ó×Ö.Èç¹ûÓеĻ°²¢ÇÒÐÒéÏà·û,ÔÚÕâ¸öÀý×ÓÖоÍÊÇÐèÒªIPPROTO_UDPÀàÐÍ.ϵͳ¾Í¸øÿ¸öÕâÑùµÄsocket½ÓÊÕ»º³åÇø·¢ËÍÒ»¸öÊý¾ÝÖ¡¿½±´.È»ºó½øÈëÏÂÒ»²½.¡¡¡¡×îºó,½øÈëudpÊäÈëÀý³Ì...¡¡¡¡ps:Èç¹ûУÑéºÍ³ö´íµÄ»°,Äں˻áÖ±½Ó¶ªÆú¸ÃÊý¾Ý°üµÄ.¶ø²»»á¿½±´¸øsock_rawµÄÌ×½Ó×Ö,ÒòΪУÑéºÍ¶¼³ö´íÁË,Êý¾Ý¿Ï¶¨ÓÐÎÊÌâµÄ°üÀ¨ËùÓÐÐÅÏ¢¶¼Ã»ÓÐÒâÒåÁË.¡¡¡¡½øÒ»²½·ÖÎöËûÃǵÄÄÜÁ¦.¡¡¡¡1.socket(AF_INET,SOCK_RAW,IPPROTO_UDP);¡¡¡¡ÄÜ:¸ÃÌ×½Ó×Ö¿ÉÒÔ½ÓÊÕÐÒéÀàÐÍΪ(tcpudpicmpµÈ)·¢Íù±¾»úµÄipÊý¾Ý°ü,´ÓÉÏÃæ¿´µÄ¾ÍÊÇ20+8+100.¡¡¡¡²»ÄÜ:²»ÄÜÊÕµ½·Ç·¢Íù±¾µØipµÄÊý¾Ý°ü(ipÈí¹ýÂ˻ᶪÆúÕâЩ²»ÊÇ·¢Íù±¾»úipµÄÊý¾Ý°ü).¡¡¡¡²»ÄÜ:²»ÄÜÊÕµ½´Ó±¾»ú·¢ËͳöÈ¥µÄÊý¾Ý°ü.¡¡¡¡·¢Ë͵Ļ°ÐèÒª×Ô¼º×éÖ¯tcpudpicmpµÈÍ·²¿.¿ÉÒÔsetsockoptÀ´×Ô¼º°ü×°ipÍ·²¿¡¡¡¡ÕâÖÖÌ×½Ó×ÖÓÃÀ´Ð´¸öping³ÌÐò±È½ÏÊʺϡ¡¡¡2.socket(PF_PACKET,SOCK_RAW,htons(x));¡¡¡¡Õâ¸öÌ×½Ó×ֱȽÏÇ¿´ó,´´½¨ÕâÖÖÌ×½Ó×Ö¿ÉÒÔ¼àÌýÍø¿¨ÉϵÄËùÓÐÊý¾ÝÖ¡.´ÓÉÏÃæ¿´¾ÍÊÇ20+20+8+100.×îºóÒ»¸öÒÔÌ«Íøcrc´ÓÀ´¶¼²»Ëã½øÀ´µÄ,ÒòΪÄÚºËÒѾÅжϹýÁË,¶Ô³ÌÐòÀ´ËµÃ»ÓÐÈκÎÒâÒåÁË.¡¡¡¡ÄÜ:½ÓÊÕ·¢Íù±¾µØmacµÄÊý¾ÝÖ¡¡¡¡¡ÄÜ:½ÓÊÕ´Ó±¾»ú·¢ËͳöÈ¥µÄÊý¾ÝÖ¡(µÚ3¸ö²ÎÊýÐèÒªÉèÖÃΪETH_P_ALL)¡¡¡¡ÄÜ:½ÓÊÕ·Ç·¢Íù±¾µØmacµÄÊý¾ÝÖ¡(Íø¿¨ÐèÒªÉèÖÃΪpromisc»ìÔÓģʽ)¡¡¡¡ÐÒéÀàÐÍÒ»¹²ÓÐËĸö¡¡¡¡ETH_P_IP0x800Ö»½ÓÊÕ·¢Íù±¾»úmacµÄipÀàÐ͵ÄÊý¾ÝÖ¡¡¡¡¡ETH_P_ARP0x806Ö»½ÓÊÜ·¢Íù±¾»úmacµÄarpÀàÐ͵ÄÊý¾ÝÖ¡¡¡¡¡ETH_P_ARP0x8035Ö»½ÓÊÜ·¢Íù±¾»úmacµÄrarpÀàÐ͵ÄÊý¾ÝÖ¡¡¡¡¡ETH_P_ALL0x3½ÓÊÕ·¢Íù±¾»úmacµÄËùÓÐÀàÐÍiparprarpµÄÊý¾ÝÖ¡,½ÓÊÕ´Ó±¾»ú·¢³öµÄËùÓÐÀàÐ͵ÄÊý¾ÝÖ¡.(»ìÔÓģʽ´ò¿ªµÄÇé¿öÏÂ,»á½ÓÊÕµ½·Ç·¢Íù±¾µØmacµÄÊý¾ÝÖ¡)¡¡¡¡3.socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL))£¬Õâ¸öÒ»°ãÓÃÓÚ×¥°ü³ÌÐò¡£¡¡¡¡×ܽáʹÓ÷½·¨:¡¡¡¡1.Ö»ÏëÊÕµ½·¢Íù±¾»úijÖÖÐÒéµÄipÊý¾Ý°üµÄ»°ÓõÚÒ»ÖÖ¾Í×ã¹»ÁË¡¡¡¡2.¸ü¶àµÄÏêϸµÄÄÚÈÝÇëʹÓõڶþÖÖ.°üÀ¨ETH_P_ALL²ÎÊýºÍ»ìÔÓģʽ¶¼¿ÉÒÔʹËüµÄÄÜÁ¦²»¶ÏµÄ¼ÓÇ¿.ÏÂÃæµÄ³ÌÐòÀûÓÃRawSocket·¢ËÍTCP±¨ÎÄ£¬²¢ÍêÈ«ÊÖ¹¤½¨Á¢±¨Í·£ºintsendTcp(unsignedshortdesPort,unsignedlongdesIP){¡¡WSADATAWSAData;¡¡SOCKETsock;¡¡SOCKADDR_INaddr_in;¡¡IPHEADERipHeader;¡¡TCPHEADERtcpHeader;¡¡PSDHEADERpsdHeader;¡¡charszSendBuf[MAX_LEN]={0};¡¡BOOLflag;¡¡intrect,nTimeOver;¡¡if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)¡¡{¡¡¡¡printf("WSAStartupError!\n");¡¡¡¡returnfalse;¡¡}¡¡if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)¡¡{¡¡¡¡printf("SocketSetupError!\n");¡¡¡¡returnfalse;¡¡}¡¡flag=true;¡¡if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR)¡¡{¡¡¡¡printf("setsockoptIP_HDRINCLerror!\n");¡¡¡¡returnfalse;¡¡}¡¡nTimeOver=1000;¡¡if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver))==SOCKET_ERROR)¡¡{¡¡¡¡printf("setsockoptSO_SNDTIMEOerror!\n");¡¡¡¡returnfalse;¡¡}¡¡addr_in.sin_family=AF_INET;¡¡addr_in.sin_port=htons(desPort);¡¡addr_in.sin_addr.S_un.S_addr=inet_addr(desIP);¡¡//Ìî³äIP±¨Í·¡¡ipHeader.h_verlen=(4<<4|sizeof(ipHeader)/sizeof(unsignedlong));¡¡//ipHeader.tos=0;¡¡ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));¡¡ipHeader.ident=1;¡¡ipHeader.frag_and_flags=0;¡¡ipHeader.ttl=128;¡¡ipHeader.proto=IPPROTO_TCP;¡¡ipHeader.checksum=0;¡¡ipHeader.sourceIP=inet_addr("localhost");¡¡ipHeader.destIP=desIP;¡¡//Ìî³äTCP±¨Í·¡¡tcpHeader.th_dport=htons(desPort);¡¡tcpHeader.th_sport=htons(SOURCE_PORT);//Ô´¶Ë¿ÚºÅ¡¡tcpHeader.th_seq=htonl(0x12345678);¡¡tcpHeader.th_ack=0;¡¡tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);¡¡tcpHeader.th_flag=2;//±ê־λ̽²â£¬2ÊÇSYN¡¡tcpHeader.th_win=htons(512);¡¡tcpHeader.th_urp=0;¡¡tcpHeader.th_sum=0;¡¡psdHeader.saddr=ipHeader.sourceIP;¡¡psdHeader.daddr=ipHeader.destIP;¡¡psdHeader.mbz=0;¡¡psdHeader.ptcl=IPPROTO_TCP;¡¡psdHeader.tcpl=htons(sizeof(tcpHeader));¡¡//¼ÆËãУÑéºÍ¡¡memcpy(szSendBuf,&psdHeader,sizeof(psdHeader));¡¡memcpy(szSendBuf+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader));¡¡tcpHeader.th_sum=checksum((unsignedshort*)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));¡¡¡¡memcpy(szSendBuf,&ipHeader,sizeof(ipHeader));¡¡memcpy(szSendBuf+sizeof(ipHeader),&tcpHeader,sizeof(tcpHeader));