рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдПрдкреЛрд▓ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рд▓реЗрдЦ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ:

рдкрд░рд┐рдЪрдп


рд╕рдВрд╕реНрдХрд░рдг 2.6 рдХреЗ рдмрд╛рдж рд╕реЗ, рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдПрдкреЛрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рд▓реЗрдЦ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдкрд╛рдпрдерди 3 рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗред
рдореИрдВрдиреЗ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдВрдЧреНрд░реЗрдЬреА рд╢рдмреНрджреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рддреЛ "рд░рдЬрд┐рд╕реНрдЯрд░ / рдЕрдкрдВрдЬреАрдХреГрдд" "рд╕рджрд╕реНрдпрддрд╛ / рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд", "рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ" - "рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ" рдмрди рдЧрдпрд╛ред рдореИрдВрдиреЗ "рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░" рдХреЛ "рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ "рдЙрддреНрдкрд╛рджрди рдкрд░ рд╕рд░реНрд╡рд░" рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред "рдереНрд░реЗрдб" рдХрд╛ рдЕрдиреБрд╡рд╛рдж "рдереНрд░реЗрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ "рдереНрд░реЗрдб" рдХреЗ рд░реВрдк рдореЗрдВред
рдореИрдВрдиреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реБрдП рдШрдЯрдирд╛рдУрдВ, рдореЛрдб рдФрд░ рдЭрдВрдбреЗ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдкрд╛рдпрдерди 3 рдХреЗ рд▓рд┐рдП рд╣реИ, рд╕рдм рдХреБрдЫ рдЕрдЬрдЧрд░ 2.6 рдореЗрдВ рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕реЙрдХреЗрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛


рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рдпрдерди 3.0 рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 8080 рдкрд░ рд╕реБрдирддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХрдВрд╕реЛрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ HTTP рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ HOWTO рдореЗрдВ рдкрд╛рдпрдерди рдореЗрдВ рд╕реЙрдХреЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд░реНрдгрди рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
  1. рдЖрдпрд╛рдд рд╕реЙрдХреЗрдЯ
  2. EOL1 = b '\ n \ n'
  3. EOL2 = b '\ n \ r \ n'
  4. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = b 'рдПрдЪрдЯреАрдЯреАрдкреА / 1.0 200 рдУрдХреЗ \ r \ n рджрд┐рдирд╛рдВрдХ: рд╕реЛрдо, 1 рдЬрдирд╡рд░реА 1996 01:01:01 GMT \ r \'
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛ \ r \ n рдирд┐рдпрдВрддреНрд░рдг-рд▓рдВрдмрд╛рдИ: 13 \ r \ n \ r \ n'
  6. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!'
  7. serverocket = рд╕реЙрдХреЗрдЯ ред рд╕реЙрдХреЗрдЯ ( рд╕реЙрдХреЗрдЯ .AF_INET, рд╕реЙрдХреЗрдЯ .SOCK_STREAM)
  8. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .SOL_SOCKET, рд╕реЙрдХреЗрдЯ .SO_REUSEADDR, 1
  9. serverocket.bind (( '0.0.0.0' , 8080 ))
  10. serverocket.listen ( 1 )
  11. рдХрдиреЗрдХреНрд╢рди, рдкрддреЗ = serverocket.accept ()
  12. рдирд┐рд╡реЗрджрди = b ''
  13. рдЬрдмрдХрд┐ EOL1 рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ EOL2 рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд╣реАрдВ рд╣реИ :
  14. рдЕрдиреБрд░реЛрдз + = connectiontoclient.recv ( 1024 )
  15. рдкреНрд░рд┐рдВрдЯ (request.decode ())
  16. connectiontoclient.send (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛)
  17. connectiontoclient.close ()
  18. serverocket.close ()

рдЙрджрд╛рд╣рд░рдг 2 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрд╡рд░реЛрдз (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рд╕реЗ) рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдкреБрди: рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди 15 рдореЗрдВ рдПрдХ рд▓реВрдк рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд▓реНрдХрд┐, рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ 23-24 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╢реНрд░рд╡рдг рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рд╡реИрд╕реЗ рднреА рдмрдВрдж рд╣реЛ, рднрд▓реЗ рд╣реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВред

рдЙрджрд╛рд╣рд░рдг 2
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
  1. рдЖрдпрд╛рдд рд╕реЙрдХреЗрдЯ
  2. EOL1 = b '\ n \ n'
  3. EOL2 = b '\ n \ r \ n'
  4. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = b 'рдПрдЪрдЯреАрдЯреАрдкреА / 1.0 200 рдУрдХреЗ \ r \ n рджрд┐рдирд╛рдВрдХ: рд╕реЛрдо, 1 рдЬрдирд╡рд░реА 1996 01:01:01 GMT \ r \'
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛ \ r \ n рдирд┐рдпрдВрддреНрд░рдг-рд▓рдВрдмрд╛рдИ: 13 \ r \ n \ r \ n'
  6. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!'
  7. serverocket = рд╕реЙрдХреЗрдЯ ред рд╕реЙрдХреЗрдЯ ( рд╕реЙрдХреЗрдЯ .AF_INET, рд╕реЙрдХреЗрдЯ .SOCK_STREAM)
  8. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .SOL_SOCKET, рд╕реЙрдХреЗрдЯ .SO_REUSEADDR, 1
  9. serverocket.bind (( '0.0.0.0' , 8080 ))
  10. serverocket.listen ( 1 )
  11. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  12. рдЬрдмрдХрд┐ рд╕рдЪ:
  13. рдХрдиреЗрдХреНрд╢рди, рдкрддреЗ = serverocket.accept ()
  14. рдирд┐рд╡реЗрджрди = b ''
  15. рдЬрдмрдХрд┐ EOL1 рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ EOL2 рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд╣реАрдВ рд╣реИ :
  16. рдЕрдиреБрд░реЛрдз + = connectiontoclient.recv ( 1024 )
  17. рдкреНрд░рд┐рдВрдЯ ( '-' * 40 + '\ n' + request.decode () [: - 2 ])
  18. connectiontoclient.send (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛)
  19. connectiontoclient.close ()
  20. рдЕрдВрдд рдореЗрдВ :
  21. serverocket.close ()


рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯреНрд╕ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдПрдкреЛрд▓ рдХреЗ рд▓рд╛рдн


рдЙрджрд╛рд╣рд░рдг 2 рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рдЖрдиреЗ рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рд▓рд╛рдЗрди 16 рдкрд░ рд╕реНрд╡реАрдХрд╛рд░ () рдХреЙрд▓ рдЕрд╡рд░реБрджреНрдз рд╣реИред рдЬрдм рддрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдЬрдм рддрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ) рддрдм рддрдХ 19 рд░реАрд╡реНрдпреВ () рдХреЙрд▓ рдСрди рд╣реИред рд▓рд╛рдЗрди 21 рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬреЗ рдЧрдП рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдирдХреНрд╕ рднреЗрдЬрдиреЗ рдХреА рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдВрдб () рдХреЙрд▓ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдПрдХ рд╕реБрдирдиреЗ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЗрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдирд╡ рдирд┐рд░реНрдорд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЙрдХреЗрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧрд╛ред рдЪреВрдВрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд╛рд╣ рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрдорддрд┐ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддрд╛ рд╣реИред рдпреЗ рддрд╛рд▓реЗ рдЕрдиреНрдп рдзрд╛рдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддреЗ рд╣реИрдВред

рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░рд▓ рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдорд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рд╕рд╣реА рд╕рдВрдпреБрдХреНрдд рдкрд╣реБрдВрдЪ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдФрд░ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХрд▓ рд╕реАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред

рдЕрдВрдХ C10K рдХрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЗрд╡реЗрдВрдЯ рдЖрдиреЗ рддрдХ рдРрд╕реА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯ рдкрд░ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рд╕рдлрд▓рддрд╛ рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯреНрд╕ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рднреА рдХрд╛рдо рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдореЗрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдПрдХрд▓-рд╕реВрддреНрд░реАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдПрдХрд▓ рдереНрд░реЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдЕрд╡рд░реБрджреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓рд┐рдирдХреНрд╕ 2.6 рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрдИ рддрдВрддреНрд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рддреАрди рдХрд╛ рдЪрдпрди , рдкреЛрд▓ рдФрд░ рдПрдкреЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдПрдкреЛрд▓ рдФрд░ рдкреЛрд▓ рдЪрдпрди рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕реЙрдХреЗрдЯ рдкрд░ рдмреНрдпрд╛рдЬ рдХреА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рдШрдЯрдирд╛рдПрдВ рдХрд┐рд╕ рд╕реЙрдХреЗрдЯ рдореЗрдВ рд╣реБрдИрдВред рдФрд░ рдПрдкреЛрд▓, рдмрджрд▓реЗ рдореЗрдВ, рдкреЛрд▓ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкрд╛рдЗрдерди рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдмреНрдпрд╛рдЬ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдмрд▓реНрдХрд┐, рдЬрдм рдкрд╛рдпрдерди рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпреЗ рдШрдЯрдирд╛рдПрдБ рд╣реБрдИ рд╣реИрдВ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдкреЛрд▓ рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ (рд╣рдЬрд╛рд░реЛрдВ) рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рддрдВрддреНрд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрди рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдкреЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЙрдХреЗрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдПрдкреЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
  1. рдПрдХ рдПрдкреЛрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдПрдкреЛрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЙрдХреЗрдЯ рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рдПрдкреЛрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкреВрдЫрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдкреЛрд▓ рдХреЗ рдмрд╛рдж рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рдХреМрди рд╕реА рдХреБрд░реНрд╕рд┐рдпрд╛рдВ тАЛтАЛрд╣реИрдВ
  4. рдЗрди рд╕реЙрдХреЗрдЯреНрд╕ рдкрд░ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред
  5. рдПрдкреЛрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реЙрдХреЗрдЯреНрд╕ рдФрд░ / рдпрд╛ рджреЗрдЦреА рдЧрдИ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  6. рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг 3 рдХреЛ 5 рд╕реЗ рджреЛрд╣рд░рд╛рдПрдВ
  7. рдирд╖реНрдЯ рдХрд░ рджреА рдЧрдИ рдПрдкреЛрд▓ рд╡рд╕реНрддреБ

рдЙрджрд╛рд╣рд░рдг 3 рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг 2 рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдзрд╛рдЧрд╛ рдмрджрд▓реЗ рдореЗрдВ рдХрдИ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 3
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
  1. рдЖрдпрд╛рдд рд╕реЙрдХреЗрдЯ, рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
  2. EOL1 = b '\ n \ n'
  3. EOL2 = b '\ n \ r \ n'
  4. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = b 'рдПрдЪрдЯреАрдЯреАрдкреА / 1.0 200 рдУрдХреЗ \ r \ n рджрд┐рдирд╛рдВрдХ: рд╕реЛрдо, 1 рдЬрдирд╡рд░реА 1996 01:01:01 GMT \ r \'
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛ \ r \ n рдирд┐рдпрдВрддреНрд░рдг-рд▓рдВрдмрд╛рдИ: 13 \ r \ n \ r \ n'
  6. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!'
  7. serverocket = рд╕реЙрдХреЗрдЯ ред рд╕реЙрдХреЗрдЯ ( рд╕реЙрдХреЗрдЯ .AF_INET, рд╕реЙрдХреЗрдЯ .SOCK_STREAM)
  8. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .SOL_SOCKET, рд╕реЙрдХреЗрдЯ .SO_REUSEADDR, 1
  9. serverocket.bind (( '0.0.0.0' , 8080 ))
  10. serverocket.listen ( 1 )
  11. serverocket.setblocking ( 0 )
  12. epoll = select .epoll ()
  13. epoll.register (serverocket.fileno) (, .EPOLLIN) рдЪреБрдиреЗрдВ
  14. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  15. рдХрдиреЗрдХреНрд╢рди = {}; рдЕрдиреБрд░реЛрдз = {}; рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ = {}
  16. рдЬрдмрдХрд┐ рд╕рдЪ:
  17. рдШрдЯрдирд╛рдПрдБ = epoll.poll ( 1 )
  18. fileno рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рдШрдЯрдирд╛:
  19. рдЕрдЧрд░ fileno == serverocket.fileno ():
  20. рдХрдиреЗрдХреНрд╢рди, рдкрддрд╛ = serverocket.accept ()
  21. рдХрдиреЗрдХреНрд╢рди.рд╕реЗрдЯрдмреНрд▓реЙрдХрд┐рдВрдЧ ( 0 )
  22. epoll.register (connection.fileno) (, рдЪреБрдиреЗрдВ .EPOLLIN)
  23. рдХрдиреЗрдХреНрд╢рди [connection.fileno ()] = рдХрдиреЗрдХреНрд╢рди
  24. рдЕрдиреБрд░реЛрдз [рдХрдиреЗрдХреНрд╢рди .fileno ()] = b ''
  25. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [рдХрдиреЗрдХреНрд╢рди .fileno ()] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  26. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLIN:
  27. рдЕрдиреБрд░реЛрдз [fileno] + = рдХрдиреЗрдХреНрд╢рди [fileno] .recv ( 1024 )
  28. рдпрджрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL1 [fileno] рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL2 [fileno]:
  29. epoll.modify (рдлрд╛рдЗрдиреЗрдиреЛ, рд╕реЗрд▓реЗрдХреНрдЯ .EPOLLOUT)
  30. рдкреНрд░рд┐рдВрдЯ ( '-' * 40 + '\ n' + рдЕрдиреБрд░реЛрдз [рдлрд╛рдЗрд▓реЛ] .рдбреЙрд╕реНрдХреЛрдк () [: - 2 ])
  31. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLOUT:
  32. byteswritten = рдХрдиреЗрдХреНрд╢рди [fileno]ред рдПрд╕реЗрдВрдб (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ [fileno])
  33. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] [рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрд┐рдд:]
  34. рдЕрдЧрд░ рд▓реЗрди (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [fileno]) == 0 :
  35. epoll.modify (рдлрд╝рд┐рд▓рд┐рдиреЛ, 0 )
  36. рдХрдиреЗрдХреНрд╢рди [fileno]ред рд╢рдЯрдбрд╛рдЙрди ( рд╕реЙрдХреЗрдЯ .SHUT_RDWR)
  37. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪрдпрди .EPOLLHUP:
  38. epoll.unregister (fileno)
  39. рдХрдиреЗрдХреНрд╢рди [fileno] .close ()
  40. рдбреЗрд▓ рдХрдиреЗрдХреНрд╢рди [рдлрд╛рдЗрд▓реЛ]
  41. рдЕрдВрдд рдореЗрдВ :
  42. epoll.unregister (serverocket.fileno ())
  43. epoll.close ()
  44. serverocket.close ()

рдПрдкреЛрд▓ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рджреЛ рдореЛрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдЬ-рдЯреНрд░рд┐рдЧрд░ рдФрд░ рд▓реЗрд╡рд▓-рдЯреНрд░рд┐рдЧрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдЬ-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдореЗрдВ, рдХреЙрд▓ рдХрд░рдирд╛ epoll.poll () рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж рд╕реЙрдХреЗрдЯ рдкрд░ рд╣реБрдИ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред рдХреЙрд▓рд░ рдХреЛ рдЗрд╕ рдШрдЯрдирд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд┐рдП рдмрд╛рд░-рдмрд╛рд░ epoll.poll () рдореЗрдВред рдЬрдм рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдИрд╡реЗрдВрдЯ рдХрд╛ рдбреЗрдЯрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕реНрддрд░-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдореЗрдВ, epoll.poll () рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмреНрдпрд╛рдЬ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рдмрд╛рд░-рдмрд╛рд░ рд╕реВрдЪрдирд╛ рдорд┐рд▓реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рд╕реНрддрд░-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдХреЛ рдПрдХ рдПрдкреЛрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдЬ-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирдП рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП () рдЬрдм рддрдХ рдХрд┐ рд╕реЙрдХреЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ ред рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ ред рд╕реНрддрд░-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдореЗрдВ, рдПрдХ рдПрдХрд▓ рд╕реНрд╡реАрдХрд╛рд░ () рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХрддрд╛рд░ рдореЗрдВ рдЕрдЧрд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреЛрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд┐рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 3 рд╕реНрддрд░-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЛрдб рд╣реИред рдЙрджрд╛рд╣рд░рдг 4 рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдЬ-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рд▓рд╛рдЗрдиреНрд╕ 25, 36, рдФрд░ 45 рдРрд╕реЗ рдЪрдХреНрд░реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рддрдм рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛ (рдпрд╛ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ)ред рд▓рд╛рдЗрдиреНрд╕ 32, 38, рдФрд░ 48 рдХреИрдЪ рдЕрдкрд╡рд╛рдж рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд▓рд╛рдЗрдиреЛрдВ 16, 28, 41, рдФрд░ 51 рдореЗрдВ рдПрдХ EPOLLET рдорд╛рд╕реНрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдЬ-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 4
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
  1. рдЖрдпрд╛рдд рд╕реЙрдХреЗрдЯ, рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
  2. EOL1 = b '\ n \ n'
  3. EOL2 = b '\ n \ r \ n'
  4. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = b 'рдПрдЪрдЯреАрдЯреАрдкреА / 1.0 200 рдУрдХреЗ \ r \ n рджрд┐рдирд╛рдВрдХ: рд╕реЛрдо, 1 рдЬрдирд╡рд░реА 1996 01:01:01 GMT \ r \'
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛ \ r \ n рдирд┐рдпрдВрддреНрд░рдг-рд▓рдВрдмрд╛рдИ: 13 \ r \ n \ r \ n'
  6. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!'
  7. serverocket = рд╕реЙрдХреЗрдЯ ред рд╕реЙрдХреЗрдЯ ( рд╕реЙрдХреЗрдЯ .AF_INET, рд╕реЙрдХреЗрдЯ .SOCK_STREAM)
  8. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .SOL_SOCKET, рд╕реЙрдХреЗрдЯ .SO_REUSEADDR, 1
  9. serverocket.bind (( '0.0.0.0' , 8080 ))
  10. serverocket.listen ( 1 )
  11. serverocket.setblocking ( 0 )
  12. epoll = select .epoll ()
  13. epoll.register (serverocket.fileno) (, рдЪреБрдиреЗрдВ .EPOLLIN | select .EPOLLET)
  14. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  15. рдХрдиреЗрдХреНрд╢рди = {}; рдЕрдиреБрд░реЛрдз = {}; рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ = {}
  16. рдЬрдмрдХрд┐ рд╕рдЪ:
  17. рдШрдЯрдирд╛рдПрдБ = epoll.poll ( 1 )
  18. fileno рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рдШрдЯрдирд╛:
  19. рдЕрдЧрд░ fileno == serverocket.fileno ():
  20. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  21. рдЬрдмрдХрд┐ рд╕рдЪ:
  22. рдХрдиреЗрдХреНрд╢рди, рдкрддрд╛ = serverocket.accept ()
  23. рдХрдиреЗрдХреНрд╢рди.рд╕реЗрдЯрдмреНрд▓реЙрдХрд┐рдВрдЧ ( 0 )
  24. epoll.register (connection.fileno) (, select .EPOLLIN | select .EPOLLET)ред
  25. рдХрдиреЗрдХреНрд╢рди [connection.fileno ()] = рдХрдиреЗрдХреНрд╢рди
  26. рдЕрдиреБрд░реЛрдз [рдХрдиреЗрдХреНрд╢рди .fileno ()] = b ''
  27. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [рдХрдиреЗрдХреНрд╢рди .fileno ()] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  28. рд╕реЙрдХреЗрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред
  29. рдкрд╛рд╕
  30. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLIN:
  31. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  32. рдЬрдмрдХрд┐ рд╕рдЪ:
  33. рдЕрдиреБрд░реЛрдз [fileno] + = рдХрдиреЗрдХреНрд╢рди [fileno] .recv ( 1024 )
  34. рд╕реЙрдХреЗрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред
  35. рдкрд╛рд╕
  36. рдпрджрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL1 [fileno] рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL2 [fileno]:
  37. epoll.modify (рдлрд╛рдЗрдиреЗрдиреЛ, рд╕реЗрд▓реЗрдХреНрдЯ .EPOLLOUT | рд╕рд┐рд▓реЗрдХреНрдЯ .EPOLLET)
  38. рдкреНрд░рд┐рдВрдЯ ( '-' * 40 + '\ n' + рдЕрдиреБрд░реЛрдз [рдлрд╛рдЗрд▓реЛ] .рдбреЙрд╕реНрдХреЛрдк () [: - 2 ])
  39. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLOUT:
  40. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  41. рдЬрдмрдХрд┐ рд▓реЗрди (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [fileno])> 0 :
  42. byteswritten = рдХрдиреЗрдХреНрд╢рди [fileno]ред рдПрд╕реЗрдВрдб (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ [fileno])
  43. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] [рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрд┐рдд:]
  44. рд╕реЙрдХреЗрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред
  45. рдкрд╛рд╕
  46. рдЕрдЧрд░ рд▓реЗрди (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [fileno]) == 0 :
  47. epoll.modify (рдлрд╛рдЗрдиреЗрдиреЛ, рд╕реЗрд▓реЗрдХреНрдЯ .EPOLLET)
  48. рдХрдиреЗрдХреНрд╢рди [fileno]ред рд╢рдЯрдбрд╛рдЙрди ( рд╕реЙрдХреЗрдЯ .SHUT_RDWR)
  49. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪрдпрди .EPOLLHUP:
  50. epoll.unregister (fileno)
  51. рдХрдиреЗрдХреНрд╢рди [fileno] .close ()
  52. рдбреЗрд▓ рдХрдиреЗрдХреНрд╢рди [рдлрд╛рдЗрд▓реЛ]
  53. рдЕрдВрдд рдореЗрдВ :
  54. epoll.unregister (serverocket.fileno ())
  55. epoll.close ()
  56. serverocket.close ()

рд╕рднреА рд╕рдорд╛рдирддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрддрд░-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдЪрдпрди рдпрд╛ рдкреЛрд▓ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдЬ-рдЯреНрд░рд┐рдЧрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдЗрд╡реЗрдВрдЯ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд░реНрдерди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЗрди рджреЛ рдореЛрдбреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ EPOLLONESHOT рдИрд╡реЗрдВрдЯ рдореЗрдВ рднреА рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдИрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рдПрдХрд▓ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ epoll.poll (), рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рджреЗрдЦреА рдЧрдИ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ


рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рдХрддрд╛рд░ рдХреА рд▓рдВрдмрд╛рдИ

рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА 12 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдореЗрдВ serverocket.listen () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рдХрддрд╛рд░ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИ (рдмреИрдХрд▓реЙрдЧ рд╕реБрдиреЛ)ред рдпрд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рдХрдиреЗрдХреНрд╢рди рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдпрдиреЙрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдПрдХ рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдкрд░ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░ () рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреНрдп рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдлреНрдд рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдХрддрд╛рд░ рднрд░ рдЬрд╛рддреА рд╣реИ, рддреЛ рдирдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЪреБрдкрдЪрд╛рдк рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл рдЕрдирд╛рд╡рд╢реНрдпрдХ рджреЗрд░реА рд╣реЛрддреА рд╣реИред рдПрдХ рд╡реНрдпрд╕реНрдд рд╕рд░реНрд╡рд░ рдЖрдорддреМрд░ рдкрд░ рд╕реИрдХрдбрд╝реЛрдВ рдФрд░ рд╣рдЬрд╛рд░реЛрдВ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 1 рдХрд╛ рдореВрд▓реНрдп рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрдм рдПрдХ рд╕рд╛рде HTTP 1.0 рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ab рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ 50 рд╕реЗ рдХрдо рдХреА рдХрддрд╛рд░ рдХреА рд▓рдВрдмрд╛рдИ рдХрднреА-рдХрднреА рдПрдХ рдЧрдВрднреАрд░ рдкреНрд░рджрд░реНрд╢рди рдбреНрд░реЙрдк рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЯреАрд╕реАрдкреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕

TCP_CORK рд╡рд┐рдХрд▓реНрдк рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ (рдмреЛрддрд▓ рдмрдВрдж) рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг 5 рдХреА рд▓рд╛рдЗрдиреЛрдВ 34 рдФрд░ 40 рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдпрд╣ рд╡рд┐рдХрд▓реНрдк, HTTP / 1.1 рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 5
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
  1. рдЖрдпрд╛рдд рд╕реЙрдХреЗрдЯ, рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
  2. EOL1 = b '\ n \ n'
  3. EOL2 = b '\ n \ r \ n'
  4. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = b 'рдПрдЪрдЯреАрдЯреАрдкреА / 1.0 200 рдУрдХреЗ \ r \ n рджрд┐рдирд╛рдВрдХ: рд╕реЛрдо, 1 рдЬрдирд╡рд░реА 1996 01:01:01 GMT \ r \'
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛ \ r \ n рдирд┐рдпрдВрддреНрд░рдг-рд▓рдВрдмрд╛рдИ: 13 \ r \ n \ r \ n'
  6. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!'
  7. serverocket = рд╕реЙрдХреЗрдЯ ред рд╕реЙрдХреЗрдЯ ( рд╕реЙрдХреЗрдЯ .AF_INET, рд╕реЙрдХреЗрдЯ .SOCK_STREAM)
  8. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .SOL_SOCKET, рд╕реЙрдХреЗрдЯ .SO_REUSEADDR, 1
  9. serverocket.bind (( '0.0.0.0' , 8080 ))
  10. serverocket.listen ( 1 )
  11. serverocket.setblocking ( 0 )
  12. epoll = select .epoll ()
  13. epoll.register (serverocket.fileno) (, .EPOLLIN) рдЪреБрдиреЗрдВ
  14. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  15. рдХрдиреЗрдХреНрд╢рди = {}; рдЕрдиреБрд░реЛрдз = {}; рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ = {}
  16. рдЬрдмрдХрд┐ рд╕рдЪ:
  17. рдШрдЯрдирд╛рдПрдБ = epoll.poll ( 1 )
  18. fileno рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рдШрдЯрдирд╛:
  19. рдЕрдЧрд░ fileno == serverocket.fileno ():
  20. рдХрдиреЗрдХреНрд╢рди, рдкрддрд╛ = serverocket.accept ()
  21. рдХрдиреЗрдХреНрд╢рди.рд╕реЗрдЯрдмреНрд▓реЙрдХрд┐рдВрдЧ ( 0 )
  22. epoll.register (connection.fileno) (, рдЪреБрдиреЗрдВ .EPOLLIN)
  23. рдХрдиреЗрдХреНрд╢рди [connection.fileno ()] = рдХрдиреЗрдХреНрд╢рди
  24. рдЕрдиреБрд░реЛрдз [рдХрдиреЗрдХреНрд╢рди .fileno ()] = b ''
  25. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [рдХрдиреЗрдХреНрд╢рди .fileno ()] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  26. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLIN:
  27. рдЕрдиреБрд░реЛрдз [fileno] + = рдХрдиреЗрдХреНрд╢рди [fileno] .recv ( 1024 )
  28. рдпрджрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL1 [fileno] рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL2 [fileno]:
  29. epoll.modify (рдлрд╛рдЗрдиреЗрдиреЛ, рд╕реЗрд▓реЗрдХреНрдЯ .EPOLLOUT)
  30. рдХрдиреЗрдХреНрд╢рди [fileno] .setsockopt ( рд╕реЙрдХреЗрдЯ .IPPROTO_TCP, рд╕реЙрдХреЗрдЯ .TCP_CORK, 1 )
  31. рдкреНрд░рд┐рдВрдЯ ( '-' * 40 + '\ n' + рдЕрдиреБрд░реЛрдз [рдлрд╛рдЗрд▓реЛ] .рдбреЙрд╕реНрдХреЛрдк () [: - 2 ])
  32. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLOUT:
  33. byteswritten = рдХрдиреЗрдХреНрд╢рди [fileno]ред рдПрд╕реЗрдВрдб (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ [fileno])
  34. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] [рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрд┐рдд:]
  35. рдЕрдЧрд░ рд▓реЗрди (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [fileno]) == 0 :
  36. рдХрдиреЗрдХреНрд╢рди [fileno] .setsockopt ( рд╕реЙрдХреЗрдЯ .IPPROTO_TCP, рд╕реЙрдХреЗрдЯ .TCP_CORK, 0 )
  37. epoll.modify (рдлрд╝рд┐рд▓рд┐рдиреЛ, 0 )
  38. рдХрдиреЗрдХреНрд╢рди [fileno]ред рд╢рдЯрдбрд╛рдЙрди ( рд╕реЙрдХреЗрдЯ .SHUT_RDWR)
  39. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪрдпрди .EPOLLHUP:
  40. epoll.unregister (fileno)
  41. рдХрдиреЗрдХреНрд╢рди [fileno] .close ()
  42. рдбреЗрд▓ рдХрдиреЗрдХреНрд╢рди [рдлрд╛рдЗрд▓реЛ]
  43. рдЕрдВрдд рдореЗрдВ :
  44. epoll.unregister (serverocket.fileno ())
  45. epoll.close ()
  46. serverocket.close ()

рджреВрд╕рд░реА рдУрд░, TCP_NODELAY рд╡рд┐рдХрд▓реНрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕реЙрдХреЗрдЯ.рд╕реЗрдВрдб () рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдП рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдмрдлрд░рд┐рдВрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рддреБрд░рдВрдд рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг 6 рдХреЗ рд▓рд╛рдЗрди 14 рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк, SSH рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдЕрдиреНрдп рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 6
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
  1. рдЖрдпрд╛рдд рд╕реЙрдХреЗрдЯ, рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
  2. EOL1 = b '\ n \ n'
  3. EOL2 = b '\ n \ r \ n'
  4. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = b 'рдПрдЪрдЯреАрдЯреАрдкреА / 1.0 200 рдУрдХреЗ \ r \ n рджрд┐рдирд╛рдВрдХ: рд╕реЛрдо, 1 рдЬрдирд╡рд░реА 1996 01:01:01 GMT \ r \'
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛ \ r \ n рдирд┐рдпрдВрддреНрд░рдг-рд▓рдВрдмрд╛рдИ: 13 \ r \ n \ r \ n'
  6. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + = b 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!'
  7. serverocket = рд╕реЙрдХреЗрдЯ ред рд╕реЙрдХреЗрдЯ ( рд╕реЙрдХреЗрдЯ .AF_INET, рд╕реЙрдХреЗрдЯ .SOCK_STREAM)
  8. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .SOL_SOCKET, рд╕реЙрдХреЗрдЯ .SO_REUSEADDR, 1
  9. serverocket.bind (( '0.0.0.0' , 8080 ))
  10. serverocket.listen ( 1 )
  11. serverocket.setblocking ( 0 )
  12. serverocket.setsockopt ( рд╕реЙрдХреЗрдЯ .IPPROTO_TCP, рд╕реЙрдХреЗрдЯ .TCP_NODELAY, 1 )
  13. epoll = select .epoll ()
  14. epoll.register (serverocket.fileno) (, .EPOLLIN) рдЪреБрдиреЗрдВ
  15. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
  16. рдХрдиреЗрдХреНрд╢рди = {}; рдЕрдиреБрд░реЛрдз = {}; рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ = {}
  17. рдЬрдмрдХрд┐ рд╕рдЪ:
  18. рдШрдЯрдирд╛рдПрдБ = epoll.poll ( 1 )
  19. fileno рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рдШрдЯрдирд╛:
  20. рдЕрдЧрд░ fileno == serverocket.fileno ():
  21. рдХрдиреЗрдХреНрд╢рди, рдкрддрд╛ = serverocket.accept ()
  22. рдХрдиреЗрдХреНрд╢рди.рд╕реЗрдЯрдмреНрд▓реЙрдХрд┐рдВрдЧ ( 0 )
  23. epoll.register (connection.fileno) (, рдЪреБрдиреЗрдВ .EPOLLIN)
  24. рдХрдиреЗрдХреНрд╢рди [connection.fileno ()] = рдХрдиреЗрдХреНрд╢рди
  25. рдЕрдиреБрд░реЛрдз [рдХрдиреЗрдХреНрд╢рди .fileno ()] = b ''
  26. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [рдХрдиреЗрдХреНрд╢рди .fileno ()] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  27. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLIN:
  28. рдЕрдиреБрд░реЛрдз [fileno] + = рдХрдиреЗрдХреНрд╢рди [fileno] .recv ( 1024 )
  29. рдпрджрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL1 [fileno] рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ EOL2 [fileno]:
  30. epoll.modify (рдлрд╛рдЗрдиреЗрдиреЛ, рд╕реЗрд▓реЗрдХреНрдЯ .EPOLLOUT)
  31. рдкреНрд░рд┐рдВрдЯ ( '-' * 40 + '\ n' + рдЕрдиреБрд░реЛрдз [рдлрд╛рдЗрд▓реЛ] .рдбреЙрд╕реНрдХреЛрдк () [: - 2 ])
  32. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLOUT:
  33. byteswritten = рдХрдиреЗрдХреНрд╢рди [fileno]ред рдПрд╕реЗрдВрдб (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ [fileno])
  34. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ [fileno] [рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрд┐рдд:]
  35. рдЕрдЧрд░ рд▓реЗрди (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ [fileno]) == 0 :
  36. epoll.modify (рдлрд╝рд┐рд▓рд┐рдиреЛ, 0 )
  37. рдХрдиреЗрдХреНрд╢рди [fileno]ред рд╢рдЯрдбрд╛рдЙрди ( рд╕реЙрдХреЗрдЯ .SHUT_RDWR)
  38. рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪрдпрди .EPOLLHUP:
  39. epoll.unregister (fileno)
  40. рдХрдиреЗрдХреНрд╢рди [fileno] .close ()
  41. рдбреЗрд▓ рдХрдиреЗрдХреНрд╢рди [рдлрд╛рдЗрд▓реЛ]
  42. рдЕрдВрдд рдореЗрдВ :
  43. epoll.unregister (serverocket.fileno ())
  44. epoll.close ()
  45. serverocket.close ()

рд╕реНрд░реЛрдд рдХреЛрдб


рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдпрд╣рд╛рдБ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ


рдЬрдм рдХреЛрдИ рджреВрд░рд╕реНрде рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЙрдХреЗрдЯ рдмрдВрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ EPOLLIN рдИрд╡реЗрдВрдЯ рд╕реНрдерд╛рдиреАрдп рд╕реЙрдХреЗрдЯ рдкрд░ рдЖрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди VV рдкрдврд╝рдиреЗ рдкрд░ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдкрд▓
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLIN:
рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
рдЬрдмрдХрд┐ рд╕рдЪ:
рдЕрдиреБрд░реЛрдз [fileno] + = рдХрдиреЗрдХреНрд╢рди [fileno] .recv ( 1024 )

рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреЙрдкреА рд╕реЛрд░реНрд╕ | HTML рдХреЙрдкреА рдХрд░реЗрдВ
рдПрд▓реАрдл рдШрдЯрдирд╛ рдФрд░ рдЪреБрдиреЗрдВ .EPOLLIN:
рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :
рдЬрдмрдХрд┐ рд╕рдЪ:
рдбреЗрдЯрд╛ = рдХрдиреЗрдХреНрд╢рди [fileno] .recv ( 1024 )
рдпрджрд┐ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ:
epoll.modify (рдлрд╛рдЗрдиреЗрдиреЛ, рд╕реЗрд▓реЗрдХреНрдЯ .EPOLLET)
рдХрдиреЗрдХреНрд╢рди [fileno]ред рд╢рдЯрдбрд╛рдЙрди ( рд╕реЙрдХреЗрдЯ .SHUT_RDWR)
рдФрд░ :
рдЕрдиреБрд░реЛрдз [рдлрд╛рдЗрд▓реЛ] + = рдбреЗрдЯрд╛

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЬрд╛рдиреЗ рдкрд░ рдХреЛрдИ рд▓реВрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛрдЧреАред рдореИрдВ рдПрдХ рдРрд╕реЗ рдХреЛрдб рд╕реЗ рдорд┐рд▓рд╛, рдЬрд╣рд╛рдВ рдЕрдВрддрд░ рддреБрд░рдВрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЧрд▓рдд рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рдЧрд╛рддрд╛рд░ рдРрд╕реА рдмреЗрдХрд╛рд░ рдпрд╛рддреНрд░рд╛рдУрдВ рдХреЗ рдмрд╛рджред

Source: https://habr.com/ru/post/In121103/


All Articles