¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé(Èí¼þѧԺ2015) - ͼÎÄ

¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé

ʵÑé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 #include #include #include #pragma comment(lib,\ #define SERVER_PORT 12340 //¶Ë¿ÚºÅ #define SERVER_IP \//IPµØÖ· const int BUFFER_LENGTH = 1026; //»º³åÇø´óС£¬£¨ÒÔÌ«ÍøÖÐUDPµÄÊý¾ÝÖ¡Öаü³¤¶ÈӦСÓÚ1480×Ö½Ú£© const int SEND_WIND_SIZE = 10;//·¢ËÍ´°¿Ú´óСΪ10£¬GBNÖÐÓ¦Âú×ã W + 1 <= N£¨WΪ·¢ËÍ´°¿Ú´óС£¬NΪÐòÁкŸöÊý£© //±¾ÀýÈ¡ÐòÁкÅ0...19¹²20¸ö //Èç¹û½«´°¿Ú´óСÉèΪ1£¬ÔòΪͣ-µÈЭÒé const int SEQ_SIZE = 20; //ÐòÁкŵĸöÊý£¬´Ó0~19¹²¼Æ20¸ö //ÓÉÓÚ·¢ËÍÊý¾ÝµÚÒ»¸ö×Ö½ÚÈç¹ûֵΪ0£¬ÔòÊý¾Ý»á·¢ËÍʧ°Ü //Òò´Ë½ÓÊÕ¶ËÐòÁкÅΪ1~20£¬Óë·¢ËͶËÒ»Ò»¶ÔÓ¦ BOOL ack[SEQ_SIZE];//ÊÕµ½ackÇé¿ö£¬¶ÔÓ¦0~19µÄack int curSeq;//µ±Ç°Êý¾Ý°üµÄseq int curAck;//µ±Ç°µÈ´ýÈ·ÈϵÄack int totalSeq;//ÊÕµ½µÄ°üµÄ×ÜÊý int totalPacket;//ÐèÒª·¢Ë͵İü×ÜÊý //************************************ // Method: getCurTime // FullName: getCurTime // Access: public // Returns: void // Qualifier: »ñÈ¡µ±Ç°ÏµÍ³Ê±¼ä£¬½á¹û´æÈëptimeÖÐ // Parameter: char * ptime //************************************ void getCurTime(char *ptime){ char buffer[128]; memset(buffer,0,sizeof(buffer)); time_t c_time; struct tm *p; time(&c_time);

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

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ì滻Ϊ@)