2008Äê08ÔÂ13ÈÕ 23:31:52
Tracker·þÎñÆ÷Ô´Âë·ÖÎöÖ®¶þ£ºRawServerÀà- -
|
×÷ÕߣºÐ¡Âí¸ç ÈÕÆÚ£º2004-5-30 ÕâÆªÎÄÕ£¬ÎÒÃÇÀ´·ÖÎö RawServer ÒÔ¼°Ò»Ð©Ïà¹ØµÄÀà¡£RawServer ÀàµÄʵÏÖ´úÂ룬ÔÚ BitTorrent ×ÓĿ¼µÄRawServer.py ÖÐ RawServer Õâ¸öÀàµÄ×÷ÓÃÊÇʵÏÖÒ»¸öÍøÂç·þÎñÆ÷¡£¹ØÓÚÍøÂç±à³ÌµÄ֪ʶ£¬¡¶unixÍøÂç±à³Ì£º¾í1¡·ÊÇ×î¾µäµÄÊé¼®£¬ÄãÈç¹û¶ÔÕâ¿é²»Á˽⣬½¨Òé³éʱ¼ä¿´¿´Õâ±¾Êé¡£RawServer ʵÏÖµÄÊÇÒ»ÖÖʼþ¶à·¸´ÓᢷÇ×èÈûµÄÍøÂçÄ£ÐÍ¡£ËüʹÓõÄÊÇ poll() £¨¶ø²»ÊÇÎÒÃdz£¼ûµÄselect()£¬¹ØÓÚ pollºÍselectµÄ±È½Ï£¬Ò²ÔÚ¡¶unixÍøÂç±à³Ì£º¾í1¡·ÖÐÓнéÉÜ£©º¯Êý£¬´¦Àí¹ý³Ì´óÖÂÊÇÕâÑùµÄ£º Ê×ÏÈ´´½¨Ò»¸ö¼àÌý socket£¬È»ºó½«Õâ¸ö socket ¼ÓÈë poll µÄʼþÔ´£» Ëæºó½øÈë·þÎñ´¦ÀíÑ»·£¬¼´£º µ÷Óà poll() º¯Êý£¬Õâ¸öº¯Êý»á×èÈû£¬Ö±µ½ÍøÂçÉÏÓÐijЩʼþ·¢Éú»òÕß³¬Ê±²Å·µ»Ø¸øµ÷ÓÃÕߣ» ÔÚ poll()·µ»ØÖ®ºó£¬Ïȼì²éÒ»ÏÂÊÇ·ñÓÐûÓд¦ÀíµÄÈÎÎñ£¬Èç¹ûÓУ¬ÄÇôÏÈÍê³ÉÕâЩÈÎÎñ¡£È»ºó¸ù¾ÝʼþÀàÐͽøÐд¦Àí¡£ Èç¹ûÊÇÁ¬½ÓÇëÇ󣨼àÌý socketÉϵÄPOLLINʼþ£©µ½À´£¬Ëü acceptÕâ¸öÇëÇó£¬Èç¹û accept ³É¹¦£¬ÄÇô¾ÍºÍÒ»¸ö client½¨Á¢ÁËÁ¬½Ó£¬ÓÚÊǽ« accept() д´½¨µÄ socket ¼ÓÈë poll µÄʼþÔ´£» Èç¹ûÔÚÒѾ½¨Á¢µÄÁ¬½ÓÉÏ£¨Á¬½ÓsocketÉϵÄPOLLINʼþ£©£¬ÓÐÊý¾Ý¿É¶Á£¬ÄÇô½«Êý¾Ý´Ó client ¶Ë¶Á¹ýÀ´£¬×ö½øÒ»²½´¦Àí£» Èç¹ûÒѾ½¨Á¢µÄÁ¬½ÓÒѾ׼±¸ºÃ£¨Á¬½ÓsocketÉϵÄPOLLOUTʼþ£©£¬¿ÉÒÔ·¢ËÍÊý¾Ý£¬Ôò¼ì²éÊÇ·ñÓÐÊý¾ÝÐèÒª·¢ËÍ£¬Èç¹ûÓУ¬ÄÇô·¢ËÍÊý¾Ý¸ø client ¶Ë¡£ £¨ËùÒÔ£¬trackerÊÇÒ»¸öµ¥½ø³ÌµÄ·þÎñÆ÷£¬²¢Ã»ÓÐÓõ½Ï̡߳££© Bram Cohen ÈÏΪÈí¼þµÄ¿Éά»¤ÐԷdz£ÖØÒª£¬Ê¹´úÂëÒ×ÓÚά»¤µÄÖØÒªÒ»Ìõ¾ÍÊÇÉè¼Æ¿ÉÖØÓõÄÀ࣬RawServer ÔÚÉè¼ÆµÄʱºò£¬³ä·Ö¿¼Âǵ½ÁË¿ÉÖØÓÃÐÔ£¬¼¯ÖбíÏÖÔÚÁ½¸öµØ·½£º 1¡¢ ½«ÍøÂç I/O ºÍÊý¾Ý·ÖÎö´¦Àí·ÖÀë¡£ ÍøÂç·þÎñÆ÷µÄʼþ¶à·¸´Óá¢ÍøÂçI/O ²¿·Öͨ³£Êǹ̶¨²»±äµÄ£¬¶øÊý¾ÝÔÚ¶Áȡ֮ºó£¬½øÐзÖÎö´¦ÀíµÄ¹ý³ÌÔòÊǿɱäµÄ¡£RawServer ½«¿É±äµÄÊý¾Ý´¦Àí¹¤×÷£¬½»¸øÁíÍâÒ»¸ö³éÏóµÄÀà Handler £¨Êµ¼ÊÉϲ¢Ã»ÓÐÕâôһ¸öÀࣩÀ´´¦Àí¡£±ÈÈ磬ÔÚ tracker ·þÎñÆ÷µÄʵÏÖÖУ¬¾ßÌåʹÓõľÍÊÇ HTTPHandler À࣬¶øÔÚ ÒÔºó½«Òª·ÖÎöµÄ BT client ʵÏÖ´úÂëÖУ¬Óõ½µÄ¾ßÌåµÄHandler ÊÇ Encoder Àà¡£ 2¡¢ ²ÉÓÃÈÎÎñ¶ÓÁÐÀ´³éÏó³öÈÎÎñ´¦ÀíµÄ¹ý³Ì¡£ RawServerά»¤ÁËÒ»¸öÈÎÎñ¶ÓÁÐ unscheduled_tasks£¨Êµ¼ÊÊÇÒ»¸ö¶þÔª×éµÄlist£¬¶þÔª×éµÄµÚÒ»ÏîÊÇÒ»¸öº¯Êý£¬µÚ¶þÏîÊdz¬Ê±Ê±¼ä£©¡£ÔÚ³õʼ»¯µÄʱºò£¬Ê×ÏÈÏòÕâ¸ö¶ÓÁÐÖмÓÈëÒ»¸öÈÎÎñ£ºscan_for_timeouts()£¬ÕâÑù£¬Ã¿¸ôÒ»¶Îʱ¼ä£¬·þÎñÆ÷¾Í»áÈ¥¼ì²éÒ»ÏÂÊÇ·ñÓÐÁ¬½Ó³¬Ê±¡£Èç¹ûÓÐÆäËü RawServerµÄ³ÉÔ±º¯ÊýÖУ¬¶ÔÍⱩ¶µÄÓУº u __init__£º£¨³õʼ»¯º¯Êý£© u add_task()£º ÔÚÈÎÎñÁбíÖÐÔö¼ÓÒ»ÏîÈÎÎñ£¨Ò»¸öÈÎÎñÊÇÒ»¸öº¯ÊýÒÔ¼°Ò»¸öÖ¸¶¨µÄ³¬Ê±Ê±¼äµÄ×éºÏ£© u bind()£º Ê×ÏÈ´´½¨Ò»¸ösocket£¬È»ºóÉèÖÃsocketµÄÊôÐÔ£º SO_REUSEADDRºÍIP_TOS,£¬ÕâÁ½¸öÊôÐԵľßÌ庬ÒåÇë²Î¿¼¡¶unixÍøÂç±à³Ì£º¾í1¡·£¬ÁíÍ⻹½« socket ÉèÖÃΪ·Ç×èÈûµÄ¡£Ïà¶ÔÓÚ×èÈûµÄ socketÀ´Ëµ£¬·Ç×èÈûµÄ socket ÔÚÍøÂç I/O ÐÔÄÜÉÏÒªÌá¸ßÐí¶à£¬µ«ÊÇÓë´Ëͬʱ£¬±à³ÌµÄ¸´ÔÓ¶ÈÒ²ÒªÌá¸ßһЩ¡£Ïó trackerÕâÖÖ¿ÉÄÜͬʱҪ´¦Àí³ÉǧÉÏÍò¸ö²¢·¢Á¬½ÓµÄ·þÎñÆ÷£¬Ö»ÄܲÉÓ÷Ç×èÈûµÄsocket¡£ È»ºó½«¸Ã socketºÍÖ¸¶¨ipÒѾ¶Ë¿Ú°ó¶¨£» ×îºó°ÑÕâ¸ösocket ¼ÓÈë pollµÄʼþÔ´¡£ u start_connection()£º ¶ÔÍâÖ÷¶¯½¨Á¢Ò»¸öÁ¬½Ó£¬Õâ¸öº¯ÊýÔÚ´¦ÀíNAT´©Ô½µÄʱºòÓõ½ÁË£¬ÎÒÃǺóÃæ·ÖÎöµ½ NAT´©Ô½µÄʱºò£¬ÔÙ¾ßÌå½²½â¡£ u listen_forever()£º Õâ¸öº¯ÊýµÄ¹¦ÄܾÍÊÇʵÏÖÁËÎÒÔÚÇ°ÃæÃèÊöµÄÍøÂç·þÎñÆ÷µÄ´¦Àí¹ý³Ì¡£ÎÒÃÇ¿´µ½£¬ËüΨһµÄ²ÎÊýÊÇhandler£¬handlerµÄ×÷ÓþÍÊÇ·â×°Á˶ÔÊý¾ÝµÄ¾ßÌå´¦Àí¡£ listen_forever()°Ñ¶ÔÍøÂçʼþµÄ´¦Àí¹ý³Ì£¬½»¸øÁË handle_events()¡£ ÆäËüº¯Êý£¬°üÀ¨handle_events()£¬¶¼ÊÇÄÚ²¿º¯Êý£¨Ò²¾ÍÊÇÍⲿ²»»áÖ±½ÓÀ´µ÷ÓÃÕâЩº¯Êý£©¡£PythonûÓÐc++ÄÇÑù public¡¢protected¡¢private ÕâÑùµÄ±£»¤»úÖÆ£¬pythonÀàµÄÄÚ²¿º¯ÊýÃüÃûµÄ¹ßÀýÊÇÒÔÏ»®Ïß¿ªÊ¼£¬ÀýÈç RawServer ÖÐµÄ _close_dead()µÈ¡£ u handle_events()£º ʼþ´¦Àí¹ý³Ì£¬Ö÷ÒªÊǸù¾ÝÈýÖÖ²»Í¬µÄÍøÂçʼþ·Ö±ð´¦Àí£¬Ò»ÊÇÁ¬½Óʼþ£¬¶þÊǶÁʼþ¡¢ÈýÊÇдʼþ¡£ if sock == self.server.fileno() Õâ¶Î´úÂëÅжϷ¢ÉúʼþµÄsocketÊÇ·ñÊǼàÌý socket£¬Èç¹ûÊÇ£¬ÄÇô˵Ã÷ÊÇÁ¬½Óʼþ¡£ Á¬½ÓʼþµÄ´¦Àí£º ͨ¹ý accept À´½ÓÊÜÁ¬½Ó£¬²¢½«Ð½¨Á¢µÄ socket ÉèÖÃΪ·Ç×èÈû¡£ Åжϵ±Ç°Á¬½ÓÊýÊÇ·ñÒѾ´ïµ½ÁË×î´óÖµ£¨ÎªÁËÏÞÖÆ²¢·¢Á¬½ÓµÄÊýÄ¿£¬ÔÚ³õʼ»¯ RawServerµÄʱºò£¬ÐèÒªÖ¸¶¨×î´óÁ¬½ÓÊýÄ¿£©£¬Èç¹ûÒѾ´ïµ½×î´óÖµ£¬ÄÇô¹Ø±ÕÕâ¸öн¨µÄÁ¬½Ó¡£ ·ñÔò£¬¸ù¾ÝÐ嵀 socket ´´½¨Ò»¸ö SingleSocket ¶ÔÏ󣬣¨SingleSocket ·â×°ÁË¶Ô socketµÄ²Ù×÷¡££©½«Õâ¸ö¶ÔÏó¼ÓÈëÄÚ²¿µÄÁбísingle_socketsÖУ¬ÒÔ±¸ºóÓᣠ½«Õâ¸öРsocket¼ÓÈë poll µÄʼþÔ´ ×îºó£¬µ÷Óà Handler µÄexternal_connection_made() º¯Êý£¬¹ØÓÚÕâ¸öº¯Êý£¬ÔÚºóÃæ·ÖÎö HTTPHandler ʱÔÙÌÖÂÛ¡£ if (event & POLLIN) != 0: Õâ¶Î´úÂëÅжÏÊÇ·ñÊǶÁʼþ ¶ÁʼþµÄ´¦Àí£º Ê×ÏÈË¢ÐÂÒ»ÏÂÁ¬½ÓµÄ×îºó¸üÐÂʱ¼ä £¨last_hit£©¡£ È»ºó¶ÁÈ¡Êý¾Ý£» Èç¹ûʲôҲû¶Áµ½£¬ÄÇô˵Ã÷Á¬½Ó±»¹Ø±ÕÁË£¨ÔÚÍøÂç±à³ÌÖУ¬Èç¹ûÒ»¸öÁ¬½ÓÕý³£µÄ±»¹Ø±Õ£¬ÄÇô£¬Ò²»á´¥·¢¶Áʼþ£¬Ö»²»¹ýʲôҲ¶Á²»µ½£© ·ñÔò£¬µ÷Óà HandlerµÄ data_came_in() º¯ÊýÀ´´¦Àí¶Áµ½µÄÊý¾Ý¡£ if (event & POLLOUT) != 0 and s.socket is not None and not s.is_flushed(): Õâ¶Î´úÂëÅжÏÊÇ·ñÊÇдʼþ£¬¶øÇÒȷʵÓÐÊý¾ÝÐèÒª·¢ËÍ¡£ÔÚÒ»¸öÁ¬½Ó¿ÉÒÔдµÄʱºò£¬¾Í»á·¢Éúдʼþ¡£ дʼþµÄ´¦Àí£º ʵ¼Ê´úÂëÊÇÔÚ SingleSocketµÄ try_write()º¯ÊýÖС£ ÔÚÒ»¸ö·Ç×èÈûµÄÁ¬½ÓÉÏ·¢ËÍÖ¸¶¨´óСµÄÊý¾Ý£¬ºÜ¿ÉÄÜÔÚÒ»´Î·¢Ë͹ý³ÌÖУ¬Êý¾ÝûÓб»ÍêÈ«·¢ËͳöÈ¥£¨Ö»·¢ËÍÁËÒ»²¿·Ö£©¾Í·µ»ØÁË£¬ËùÒÔ£¬Ã¿´Î writeÖ®ºó£¬±ØÐëÅжÏÊÇ·ñÍêÈ«·¢ËÍÁËÊý¾Ý¡£Èç¹ûûÓз¢ËÍÍ꣬ÄÇôÏ´ÎÓжÁʼþµÄʱºò£¬»¹µÃ»ØÀ´¼ÌÐø·¢ËÍδÍêµÃÊý¾Ý¡£ÕâÒ²ÊÇÕâ¸öº¯Êý½Ð×ö try_write µÄÔÒò°É¡£ try_write() ÔÚ×îºó£¬ÒªÖØÐÂÉèÖà poll µÄʼþÔ´¡£Èç¹ûÊý¾ÝÈ«²¿·¢ËÍÍê±ÏÁË£¬ÄÇôֻÐèÒª¼àÌý¶Áʼþ£¨POLLIN£©·ñÔò£¬¼ÈÒª¼àÌý¶Áʼþ£¬Ò²Òª¼àÌýдʼþ£¨POLLOUT£©£¬ÕâÑù£¬Ò»µ©Á¬½Ó±äµÄ¿Éд£¬¿ÉÒÔ¼ÌÐø½«Ê£ÏµÄÊý¾Ý·¢ËͳöÈ¥¡£ u scan_for_timeouts()£º ÈÎÎñ´¦Àíº¯Êý£¬ËüÊ×ÏȰÑ×ÔÉí¼ÓÈëδ´¦ÀíÈÎÎñ¶ÓÁÐÖУ¬ÕâÑù£¬¾¹ýÒ»¶Îʱ¼ä£¬¿ÉÒÔ±£Ö¤Õâ¸öº¯ÊýÔٴα»µ÷Ó㬴Ӷø´ïµ½ÖÜÆÚÐÔµ÷ÓõÄЧ¹û¡£ Ëü¼ì²éÿ¸öÁ¬½ÓÊÇ·ñ³¬¹ýÖ¸¶¨Ê±¼äûÓб»Ë¢Ð£¬Èç¹ûÊÇ£¬Ôò¸ÃÁ¬½Ó¿ÉÄÜÒѾ½©ËÀ£¬ÄÇôËü¹Ø±ÕÕâ¸öÁ¬½Ó¡£ u pop_unscheduled()£º ´ÓÈÎÎñÁбíÖе¯³öÒ»¸öδ´¦ÀíµÄÈÎÎñ¡£ Óë RawServer ÅäºÏʹÓõÄÊÇ SingleSocket À࣬ÕâÊÇÒ»¸ö¸¨ÖúÀ࣬Ö÷ҪĿµÄÊÇ·â×°¶Ô socketµÄ´¦Àí°É¡£°üÀ¨Êý¾ÝµÄ·¢ËÍ£¬¶¼½»¸øËüÀ´´¦ÀíÁË¡£Õâ¸öÀà±È½Ï¼òµ¥£¬´ó¼Ò¿ÉÒÔ×Ô¼ºÈ¥¿´£¬ÎҾͲ»ÂÞàÂÁË¡£ ÒÔÉÏÊÇ¶Ô RasServer µÄ¾ßÌåʵÏÖµÄÒ»¸ö·ÖÎö£¬¿ÉÄܶÁÕß¿´µÄ»¹ÊÇÔÎÔκýºý£¬Ã»°ì·¨£¬»¹ÊDZØÐë×Ô¼ºÈ¥¿´Ô´´úÂ룬ȻºóÔÚÓöµ½ÎÊÌâµÄʱºò£¬»ØÍ·ÔÙÀ´¿´ÕâÆªÎÄÕ£¬²Å»áÓаïÖú¡£Èç¹û²»Ç××Ô¿´Ô´Â룬ÖÕ¾¿ÊÇÖ½ÉÏ̸±ø¡£ ÎÒÃÇÔÙÀ´Ð¡½áһϡ£ RawServer ·â×°ÁËÍøÂç·þÎñÆ÷µÄʵÏÖϸ½Ú£¬ËüʵÏÖÁËÒ»ÖÖʼþ¶à·´¦Àí¡¢·Ç×èÈûµÄÍøÂçÄ£ÐÍ¡£ËüÖ÷Òª¸ºÔð½¨Á¢ÐµÄÁ¬½Ó£¬´ÓÍøÂç¶ÁÈ¡ºÍ·¢ËÍÊý¾Ý£¬¶ø¶Ô¶Áµ½µÄÊý¾ÝµÄ¾ßÌå´¦Àí¹¤×÷£¬½»¸ø Handler ÀàÀ´´¦Àí£¬´Ó¶ø°ÑÍøÂçI/OºÍÊý¾Ý´¦Àí·ÖÀ뿪À´£¬Ê¹µÃ RawServer¿ÉÒÔÖØÓá£Handler ÀàÊÇÔÚµ÷Óà listen_forever() µÄʱºò£¬Óɵ÷ÓÃÕß´«µÝ½øÀ´µÄ£¬¾ßÌåµ½ tracker·þÎñÆ÷£¬¾ÍÊÇHTTPHandler¡£ÓÐÁË RawServer£¬tracker ¾Í¿ÉÒÔ×÷Ϊһ¸öÍøÂç·þÎñÆ÷ÔËÐÐÁË¡£ ÏÂÒ»½Ú£¬ÎÒÃÇ¿ªÊ¼·ÖÎö¾ßÌåʵÏÖ tracker HTTP ÐÒé´¦ÀíµÄ HTTPHandlerÀàºÍTrackerÀà
Tags£º
BT
|
Ò»¹²ÓÐ 3 ÌõÆÀÂÛ