¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé
ʵÑé2£º¿É¿¿Êý¾Ý´«ÊäÐÒéµÄÉè¼ÆÓëʵÏÖ
1¡¢ÊµÑéÄ¿µÄ
Àí½â¿É¿¿Êý¾Ý´«ÊäµÄ»ù±¾ÔÀí£»ÕÆÎÕÍ£µÈÐÒéµÄ¹¤×÷ÔÀí£»ÔÚÀí½âÍ£µÈÐÒéµÄ»ù´¡ÉÏ,Àí½â»¬¶¯´°¿ÚÐÒéµÄ»ù±¾ÔÀí£»ÕÆÎÕGBNµÄ¹¤×÷ÔÀí£»ÕÆÎÕ»ùÓÚUDPÉè¼Æ²¢ÊµÏÖÒ»¸öGBNÐÒéµÄ¹ý³ÌÓë¼¼Êõ¡£
2¡¢ÊµÑé»·¾³
? ½ÓÈëInternetµÄʵÑéÖ÷»ú£» ? Windows xp»òWindows 7/8£» ? ¿ª·¢ÓïÑÔ£ºC/C++£¨»òJava£©µÈ¡£
3¡¢ÊµÑéÄÚÈÝ
1) »ùÓÚUDPÉè¼ÆÒ»¸ö¼òµ¥µÄÍ£µÈÐÒé;
2) ÒýÈ뻬¶¯´°¿Ú¼¼Êõ,¸Ä½øÍ£µÈÐÒé,ʵÏÖÒ»¸ö¼òµ¥µÄGBNÐÒé; 2) Ä£ÄâÒýÈëÊý¾Ý°üµÄ¶ªÊ§£¬ÑéÖ¤ËùÉè¼ÆÐÒéµÄÓÐЧÐÔ;
3) ¸Ä½øËùÉè¼ÆµÄGBNÐÒ飬֧³ÖË«ÏòÊý¾Ý´«Ê䣻£¨Ñ¡×÷ÄÚÈÝ£¬¼Ó·ÖÏîÄ¿£¬¿ÉÒÔµ±ÌÃÍê³É»ò¿ÎÏÂÍê³É£©
4£©½«ËùÉè¼ÆµÄGBNÐÒé¸Ä½øΪSRÐÒé¡££¨Ñ¡×÷ÄÚÈÝ£¬¼Ó·ÖÏîÄ¿£¬¿ÉÒÔµ±ÌÃÍê³É»ò¿ÎÏÂÍê³É£©
4¡¢ÊµÑ鷽ʽ
ÿλͬѧÉÏ»úʵÑ飬ʵÑéÖ¸µ¼½ÌʦÏÖ³¡Ö¸µ¼¡£
5¡¢ÊµÑéÒªµã
1) Éî¿ÌÀí½âÍ£µÈÐÒéÓëGBNÐÒéµÄÇø±ð;
2) »ùÓÚUDPʵÏÖµÄGBNÐÒ飬¿ÉÒÔ²»½øÐвî´í¼ì²â£¬¿ÉÒÔÀûÓÃUDPÐÒé²î´í¼ì²â£»
3) ×ÔÐÐÉè¼ÆÊý¾ÝÖ¡µÄ¸ñʽ£¬Ó¦ÖÁÉÙ°üº¬ÐòÁкÅSeqºÍÊý¾ÝÁ½²¿·Ö£» 4) ×ÔÐж¨Òå·¢ËͶËÐòÁкÅSeq±ÈÌØÊýLÒÔ¼°·¢ËÍ´°¿Ú´óСW£¬Ó¦Âú×ãÌõ¼þW+1<=2L¡£
5) Ò»ÖÖ¼òµ¥µÄ·þÎñÆ÷¶Ë¼ÆʱÆ÷µÄʵÏÖ°ì·¨£ºÉèÖÃÌ×½Ó×ÖΪ·Ç×èÈû·½Ê½£¬Ôò·þÎñÆ÷¶ËÔÚrecvfrom·½·¨Éϲ»»á×èÈû£¬ÈôÕýÈ·½ÓÊÕµ½ACKÏûÏ¢£¬Ôò¼ÆʱÆ÷ÇåÁ㣬Èô´Ó¿Í»§¶Ë½ÓÊÕÊý¾Ý³¤¶ÈΪ-1£¨±íʾûÓнÓÊÕµ½ÈκÎÊý¾Ý£©£¬Ôò¼ÆʱÆ÷+1£¬¶Ô¼Æ
13
¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé
ʱÆ÷½øÐÐÅжϣ¬ÈôÆ䳬¹ýãÐÖµ£¬ÔòÅжÏΪ³¬Ê±£¬½øÐг¬Ê±ÖØ´«¡££¨µ±È»£¬Èç¹û·þÎñÆ÷Ñ¡Ôñ×èÈûģʽ£¬¿ÉÒÔÓõ½select»òepollµÄ×èÈûÑ¡Ôñº¯Êý£¬ÏêÇé¼ûMSDN£©
6) ΪÁËÄ£ÄâACK¶ªÊ§£¬Ò»ÖÖ¼òµ¥µÄʵÏÖ°ì·¨£º¿Í»§¶Ë¶Ô½ÓÊÕµÄÊý¾ÝÖ¡½øÐмÆ
Êý£¬È»ºó¶Ô×ÜÊý½øÐÐÄ£NÔËË㣬Èô¹æ¶¨ÇóÄ£ÔËËã½á¹ûΪÁãÔò·µ»ØACK£¬Ôòÿ½ÓÊÕN¸öÊý¾ÝÖ¡²Å·µ»Ø1¸öACK¡£µ±NÈ¡Öµ´óÓÚ·þÎñÆ÷¶ËµÄ³¬Ê±·§ÖµÊ±£¬Ôò»á³öÏÖ·þÎñÆ÷¶Ë³¬Ê±ÏÖÏó¡£
7) µ±ÉèÖ÷þÎñÆ÷¶Ë·¢ËÍ´°¿ÚµÄ´óСΪ1ʱ£¬GBNÐÒé¾ÍÊÇÍ£-µÈÐÒé¡£
6¡¢²Î¿¼ÄÚÈÝ
×÷ΪֻʵÏÖµ¥ÏòÊý¾Ý´«ÊäµÄGBNÐÒ飬ʵÖÊÉϾÍÊÇʵÏÖΪһ¸öC/SÓ¦Óá£
·þÎñÆ÷¶Ë£ºÊ¹ÓÃUDPÐÒé´«ÊäÊý¾Ý£¨±ÈÈç´«ÊäÒ»¸öÎļþ£©£¬µÈ´ý¿Í»§¶ËµÄÇëÇ󣬽ÓÊÕ²¢´¦ÀíÀ´×Ô¿Í»§¶ËµÄÏûÏ¢£¨ÈçÊý¾Ý´«ÊäÇëÇ󣩣¬µ±¿Í»§¶Ë¿ªÊ¼ÇëÇóÊý¾Ýʱ½øÈ롰αÁ¬½Ó¡±×´Ì¬£¨²¢²»ÊÇÕæÕýµÄÁ¬½Ó£¬Ö»ÊÇÒ»ÖÖÀàËÆÁ¬½ÓµÄÊý¾Ý·¢Ë͵Ä״̬£©£¬½«Êý¾Ý´ò°ü³ÉÊý¾Ý±¨·¢ËÍ£¬È»ºóµÈ´ý¿Í»§¶ËµÄACKÐÅÏ¢£¬Í¬Ê±Æô¶¯¼ÆʱÆ÷¡£µ±ÊÕµ½ACKʱ£¬´°¿Ú»¬¶¯£¬Õý³£·¢ËÍÏÂÒ»¸öÊý¾Ý±¨£¬¼ÆʱÆ÷ÖØмÆʱ£»ÈôÔÚ¼ÆʱÆ÷³¬Ê±Ç°Ã»ÓÐÊÕµ½ACK£¬ÔòÈ«²¿ÖØ´«´°¿ÚÄÚµÄËùÒÔÒÑ·¢Ë͵ÄÊý¾Ý±¨¡£
¿Í»§¶Ë£ºÊ¹ÓÃUDPÐÒéÏò·þÎñÆ÷¶ËÇëÇóÊý¾Ý£¬½ÓÊÕ·þÎñÆ÷¶Ë·¢Ë͵ÄÊý¾Ý±¨²¢·µ»ØÈ·ÈÏÐÅÏ¢ACK£¨×¢ÒâGBNΪÀÛ»ýÈ·ÈÏ£¬¼´ÈôACK=1ºÍ3£¬±íʾÊý¾ÝÖ¡2ÒѾÕýÈ·½ÓÊÕ£©£¬±ØÐëÄܹ»Ä£ÄâACK¶ªÊ§Ö±ÖÁ·þÎñÆ÷¶Ë³¬Ê±ÖØ´«µÄÇé¿ö¡£
(1) ·þÎñÆ÷¶ËÉè¼Æ²Î¿¼ 1£©ÃüÁî½âÎö
ΪÁ˲âÊÔ¿Í»§¶ËÓë·þÎñÆ÷¶ËµÄͨÐŽ»»¥£¬·½±ã²Ù×÷£¬ÉèÖÃÁ˴˹ý³Ì¡£Ê×ÏÈ£¬·þÎñÆ÷½ÓÊÕ¿Í»§¶Ë·¢À´µÄÇëÇóÊý¾Ý£¬
¡°-time¡±±íʾ¿Í»§¶ËÇëÇó»ñÈ¡µ±Ç°Ê±¼ä£¬·þÎñÆ÷»Ø¸´µ±Ç°Ê±¼ä£» ¡°-quit¡±±íʾ¿Í»§¶ËÍ˳ö£¬·þÎñÆ÷»Ø¸´¡°Good bye!¡±£»
¡°-testgbn¡±±íʾ¿Í»§¶ËÇëÇó¿ªÊ¼²âÊÔGBNÐÒ飬·þÎñÆ÷¿ªÊ¼½øÈëGBN´«Êä״̬£»
ÆäËûÊý¾Ý£¬Ôò·þÎñÆ÷Ö±½Ó»Ø¸´ÔÊý¾Ý¡£
2£©Êý¾Ý´«ÊäÊý¾ÝÖ¡¸ñʽ¶¨Òå
ÔÚÒÔÌ«ÍøÖУ¬Êý¾ÝÖ¡µÄMTUΪ1500×Ö½Ú£¬ËùÒÔUDPÊý¾Ý±¨µÄÊý¾Ý²¿·ÖӦСÓÚ1472×Ö½Ú£¨³ýÈ¥IPÍ·²¿20×Ö½ÚÓëUDPÍ·µÄ8×Ö½Ú£©£¬Îª´Ë£¬¶¨ÒåUDPÊý¾Ý±¨µÄÊý¾Ý²¿·Ö¸ñʽΪ£º
SeqΪ1¸ö×Ö½Ú£¬È¡ÖµÎª0~255£¬£¨¹ÊÐòÁкÅ×î¶àΪ256¸ö£©£» Data¡Ü1024¸ö×Ö½Ú£¬Îª´«ÊäµÄÊý¾Ý£»
14
¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé
×îºóÒ»¸ö×Ö½Ú·ÅÈëEOF0£¬±íʾ½áβ¡£
3£©Ô´´úÂë
#include \´´½¨VSÏîÄ¿°üº¬µÄÔ¤±àÒëÍ·Îļþ #include
15
¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé
p = localtime(&c_time); sprintf_s(buffer,\ p->tm_year + 1900, p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec); strcpy_s(ptime,sizeof(buffer),buffer); } //************************************ // Method: seqIsAvailable // FullName: seqIsAvailable // Access: public // Returns: bool // Qualifier: µ±Ç°ÐòÁкŠcurSeq ÊÇ·ñ¿ÉÓà //************************************ bool seqIsAvailable(){ int step; step = curSeq - curAck; step = step >= 0 ? step : step + SEQ_SIZE; //ÐòÁкÅÊÇ·ñÔÚµ±Ç°·¢ËÍ´°¿ÚÖ®ÄÚ if(step >= SEND_WIND_SIZE){ return false; } if(ack[curSeq]){ return true; } return false; } //************************************ // Method: timeoutHandler // FullName: timeoutHandler // Access: public // Returns: void // Qualifier: ³¬Ê±ÖØ´«´¦Àíº¯Êý£¬»¬¶¯´°¿ÚÄÚµÄÊý¾ÝÖ¡¶¼ÒªÖØ´« //************************************ void timeoutHandler(){ printf(\ int index; for(int i = 0;i< SEND_WIND_SIZE;++i){ index = (i + curAck) % SEQ_SIZE;
16