рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдПрдХ рдмреА 2 рдмреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, 1 рд╕реА, рдУрд░реЗрдХрд▓, рдПрдордПрд╕ рдПрд╕рдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░ рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рдкрд╣рд▓рд╛ "рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ" рд╡рд┐рдХрд▓реНрдк рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛, рд╡рд╣ рдерд╛ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рдорд╛рдирдХ рдХреА рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╕рдордЭ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрдереНрдп рдХреЛ рдирд╣реАрдВ рдХрд┐ рдПрдХ рд╣реА рджреИрд╡рдЬреНрдЮ рдФрд░ 1C рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдордЭреЗрдВрдЧреЗ), рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рднрд╛рд░реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ (рдЙрд╕ рд╕рдордп рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рдереЗред рдФрд░ Intel TBB, рд╣рдо рдЕрднреА рднреА Qt рдпрд╛ gSoap рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред
рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ dll рдкреНрд▓рдЧрдЗрдиреНрд╕, рддрдерд╛рдХрдерд┐рдд рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИред рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдирдпрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдм рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдереЗ:
habrahabr.ru/post/149956habrahabr.ru/company/Centrobit/blog/165441habrahabr.ru/post/163859рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рддрдм рд╣рдореЗрдВ рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдзрд┐рдорд╛рдирддрдГ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдЬреЛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд░рд▓ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рджреНрд╡рд╛рд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд╣рдо рдШрдЯрдХ рдХреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП IPC рд╕рдорд╛рдзрд╛рди (Qt рдореЗрдВ QLocalSocket, ACE рдореЗрдВ рдирд╛рдорд╛рдВрдХрд┐рдд рдкрд╛рдЗрдкреНрд╕) рдХреЛ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рдЦреБрдж рдХреА рдЫреЛрдЯреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
Boost :: interprocess :: message_queue рдЖрджрд░реНрд╢ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрддрд╛рд░ рдирд╣реАрдВ рдереА, рдмрд▓реНрдХрд┐ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░ рдереА, рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рд╣рдж рддрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ (рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЗрдЪреНрдЫрд╛ рднреА рдПрдХ рдХрд╛рд░рдг рдерд╛ рдХрд┐ рд╣рдордиреЗ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рд╣рдордиреЗ рддреБрд░рдВрдд рд▓реВрдкрдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдордирд╛ рдХрд░ рджрд┐рдпрд╛ - рдЙрдирдХреЗ рдкрд╛рд╕ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдУрд╡рд░рд╣реЗрдб рд╣реИ (рджреЗрдЦреЗрдВ
habrahabr.ru/post/81067 рджреЗрдЦреЗрдВ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдирд╛рдорд┐рдд рдкрд╛рдЗрдк рд╡рд┐рдВрдбреЛ рдФрд░ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯ рдХреА рдУрд░ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рднрд╛рдЧ 1. рд╣рдо рдЯреАрдХреЗ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ рдХрд╛ рдЕрд░реНрде рдХреЗрд╡рд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд xml-рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдЪреИрдирд▓ рдХреЛ рднреЗрдЬрдирд╛ рдерд╛ (рдмреЗрд╢рдХ, рд╕рдВрдЪрд╛рд░ рджреЛ-рддрд░рдлрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╣рдореЗрд╢рд╛ рдШрдЯрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛)ред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рдо рдХреЗ рдЬрдВрдЧрд▓ рдореЗрдВ рдирд╣реАрдВ рдЙрддрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдкрдврд╝рдиреЗ-рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди (рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЧреНрд░рд╛рд╣рдХреЛрдВ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ:
- рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рд╢реВрдиреНрдп * рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкрдврд╝рдиреЗ / рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП
- рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдпрд╛ рднреЗрдЬреА рдЧрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ), рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрд╡рд╛рдж std :: runtime_error рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рд╛рдВ, рдЕрдкрд╡рд╛рдж рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
- рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рд╕рд░реНрд╡рд░ рдЪреИрдирд▓ (рд╕реНрд╡реАрдХреГрддрд┐) рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдЪреИрдирд▓ рдмрдирд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдарди-рд▓реЗрдЦрди рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╕рд░реНрд╡рд░ рдЪреИрдирд▓ рдХреЛ рд▓реВрдк рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрд╡рд░реБрджреНрдз рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдЪреИрдирд▓ рд╕реЗ рдЬреБрдбрд╝реА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╣реИ (рдпрд╣ рдкреЙрд╕рд┐рдмрд▓ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рд╕рдорд╛рд░реЛрд╣ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬрд╝ рдПрдкреАрдЖрдИ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмреНрд▓реЙрдХрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди рдмрд╕ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдЪреИрдирд▓ рдХреЗ рдЙрд╕ рдЫреЛрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдЧрд▓реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕реБрдирдиреЗ рдХрд╛ рдЪреИрдирд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐)
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрди рд╕рд╛рд░ рд╡рд░реНрдЧ INamedPipe рдХреА рд░рдЪрдирд╛ рдХреА рдЧрдИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ WinNamedPipe рдФрд░ POSIXNamedPipe рдХрдХреНрд╖рд╛рдПрдВ рдлрд┐рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВред
#pragma once #include <stdexcept> class INamedPipe { protected: std::string _name; bool _server; INamedPipe(){}; virtual void internalReadBytes(void* buf,size_t size)=0; virtual void internalWriteBytes(const void* buf,size_t size)=0; virtual void internalFlush()=0; public: INamedPipe(const std::string prefix, const std::string& name, bool server):_name(prefix),_server(server) { _name.append(name); } void ConnectOrOpen() { if(_server) open(); else connect(); } virtual void ReadBytes(void* buf,size_t size) { if(!_server) { if(size<1) throw std::out_of_range("Size is 0 or less"); internalReadBytes(buf,size); } else throw std::runtime_error("This operation is not supported on server pipe"); } virtual void WriteBytes(const void* buf,size_t size) { if(!_server) { if(size<1) throw std::out_of_range("Size is 0 or less"); internalWriteBytes(buf,size);
INamedPipe рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рдкрде рдХрд╛ рдЙрдкрд╕рд░реНрдЧ рдЬрд╣рд╛рдВ рдЪреИрдирд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛, рдЪреИрдирд▓ рдХрд╛ рдирд╛рдо, рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЪреИрдирд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рд╕рд░реНрд╡рд░ (рдпрд╣ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
ConnectOrOpen () рдлрд╝рдВрдХреНрд╢рди рдЪреИрдирд▓ рдХреЛ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП - рдЦреБрд▓рд╛ -), рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП - рдХрдиреЗрдХреНрдЯ () рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИред
рднрд╛рдЧ 2. WinNamedPipe рдХрд╛ рдПрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ Google рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдкрд╣рд▓рд╛ рдХрджрдо рдерд╛ MSDN (
msdn.microsoft.com/en-us/library/windows/desktop/aa365592 ,
msdn.microsoft.com/en-us/library/windows/bktop/aa365588 ) рдФрд░ рд░реВрд╕реА рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди - рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓
ред Frolov-lib.ru/books/bsp/v27/ch2_3.htm рдЗрди рд▓реЗрдЦреЛрдВ рдХреА рдорджрдж рд╕реЗ, WinNamedPipe рд╡рд░реНрдЧ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рд╣рдордиреЗ рдореЗрдЯрд╛рдЯреНрд░реЗрдбрд░ (
www.mql5.com/en/articles/115 ) рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд╣рд░реА рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд▓рд┐рдЦрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рднреА рджреЗрддреЗ рд╣реИрдВред
WinNamedPipe рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - MSDN рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдирд╛рдорд┐рдд рдкрд╛рдЗрдк рдХрд╛ рдкреВрд░реНрдг рдкрде "\\ computer_name \ рдкрд╛рдЗрдк \ channel_name" рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рдирд╛рдорд╛рдВрдХрд┐рдд рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ "\\ред \ рдкрд╛рдЗрдк \ рдкрд╛рдЗрдк" (рд╣рд╛рдБ) рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред , рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдкрд╛рдЗрдк рдирд╛рдо рд╕реЗ рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ)ред
рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк HANDLE рдХрд╛ рдЗрдирдкреБрдЯ рд▓реЗрддрд╛ рд╣реИ - рдПрдХ рдРрд╕рд╛ рдирдВрдмрд░ рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо WinNamedPipe рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдирд╛рдо рд╡рд╛рд▓реЗ рдкрд╛рдЗрдк рдХреЗ HANDLE рдХреЛ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ)ред рдЗрд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ WaitForConnection () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
рдЦреБрд▓рд╛ () рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
void WinNamedPipe::open(){ _hPipe = CreateNamedPipe( (LPSTR)_name.data(), // PIPE_ACCESS_DUPLEX, // PIPE_TYPE_BYTE | // PIPE_WAIT, // PIPE_UNLIMITED_INSTANCES, // BUFFER_PIPE_SIZE, // BUFFER_PIPE_SIZE, // 0, // - (0=) NULL); // тАУ if (_hPipe == INVALID_HANDLE_VALUE) { THROW_LAST_ERROR("CreateNamedPipe failed"); }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрд░рдВрдн рдореЗрдВ рдмрдлрд░ рдЖрдХрд╛рд░ BUFFER_PIPE_SIZE рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдордиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдЬреЛ рдХрд┐ рдмрдлрд░ рд╕реЗ рдХрдИ рдЧреБрдирд╛ рдмрдбрд╝реЗ рдереЗред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: (LPSTR) _name.data ()
рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдЪреИрдирд▓ рдХрд╛ рдирд╛рдо std :: string рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, WinAPI рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдореЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ "рдорд▓реНрдЯреА-рдмрд╛рдЗрдЯ рдХреИрд░реЗрдХреНрдЯрд░ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП
habrahabr.ru/ostost/164193 рджреЗрдЦреЗрдВ) ред
CreateNamedPipe рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг MSDN (
msdn.microsoft.com/en-us/library/windows/desktop/aa365150 рдФрд░
www.frolov-lib.ru/books/bsp/v27/ch2_3.htm ) рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЪреИрдирд▓ рдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рди рдХрдиреЗрдХреНрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ:
void WinNamedPipe::connect() for(;;) { WaitNamedPipe((LPSTR)_name.data(), NMPWAIT_WAIT_FOREVER); _hPipe = CreateFile( (LPSTR)_name.data(), // GENERIC_READ | // GENERIC_WRITE, 0, NULL, // OPEN_EXISTING, // 0, NULL); // Break if the pipe handle is valid or error!=232 if (_hPipe != INVALID_HANDLE_VALUE||GetLastError() != ERROR_PIPE_BUSY) break; } if (_hPipe == INVALID_HANDLE_VALUE) THROW_LAST_ERROR("Could not open pipe"); DWORD dwMode = PIPE_TYPE_BYTE; BOOL fSuccess = SetNamedPipeHandleState( _hPipe, // &dwMode, // - NULL, // NULL); // if ( ! fSuccess) { THROW_LAST_ERROR("SetNamedPipeHandleState failed"); } }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, WaitNamedPipe рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо "рдЕрдирдиреНрдд" рд╕рд░реНрд╡рд░ рдЪреИрдирд▓ рдХреЗ рдПрдХ рдирд┐рд╢реБрд▓реНрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ CreateFile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрдиреЗрдХреНрд╢рди рд╕рдлрд▓ рдерд╛ред рдпрджрд┐ рдЪреИрдирд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╡реИрдз рд╣реИ (рдпрд╛ ERROR_PIPE_BUSY рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИ - рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдХрд┐ рдХреЛрдИ рдирд┐рд╢реБрд▓реНрдХ рдЪреИрдирд▓ рдирд╣реАрдВ рд╣реИ), рд╣рдо рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдореЛрдб рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдЪрдХреНрд░ рддрдм рддрдХ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреБрдбрд╝ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ ERROR_PIPE_BUSY рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рджрд┐рдП рдЧрдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдкрд╛рдЗрдк рдирд╛рдо рдХрд╛ рд╕рд░реНрд╡рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ WaitNamedPipe рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, GetLastError рддреНрд░реБрдЯрд┐ рдХреЛрдб 2 рд▓реМрдЯрд╛ рджреЗрдЧрд╛ (рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдвреВрдБрдв рд╕рдХрддрд╛) рдФрд░ рдХрдиреЗрдХреНрдЯ () рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред
рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, WaitForConnection () рдХреЛ рдПрдХ рдирдпрд╛ WinNamedPipe рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╣рд▓реЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЬрд┐рд╕ рдкрд░ рд░реАрдб-рд░рд╛рдЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрдВрддреНрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрдиреЗрдХреНрдЯрдиреИрдордкрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рди (рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЪреИрдирд▓ рд╣реИрдиреНрдбрд▓) рдмрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЪреИрдирд▓ рдХреЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рди рджреЗред рдлрд┐рд░, рдЕрдиреНрдп рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рди рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд╢реНрд░рд╡рдг рдЪреИрдирд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрджрд┐ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ WaitForConnection рд╕реЗ рдУрдкрди () рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
WaitForConnection () рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
WinNamedPipe* WinNamedPipe::WaitForConnection() { if(_server) { DWORD error; if (ConnectNamedPipe(_hPipe, NULL)||(error=GetLastError())==ERROR_PIPE_CONNECTED) { HANDLE client=_hPipe; open(); return new WinNamedPipe(client); } else { THROW_LAST_ERROR("WaitForConnection failed"); } } else { throw std::runtime_error("WaitForConnection is not supported on server pipe\n"); } }
рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ - рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдЪреИрдирд▓ рд╣реИрдВ, рддреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрдЯрдиреЗрдордкрд╛рдЗрдк рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЪреИрдирд▓ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, GetLastError рддреНрд░реБрдЯрд┐ рдХреЛрдб 535 рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ (рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА)
рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рд╕рд░рд▓ рдФрд░ рд╕реАрдзреЗ рджреЛрдиреЛрдВ рд╣реИрдВ:
void WinNamedPipe::internalReadBytes(void* buf,size_t size) { DWORD cbBytesRead = 0; BOOL fSuccess = FALSE; // fSuccess = ReadFile( _hPipe, // buf, // - size, // &cbBytesRead, // , NULL); // if (!fSuccess || cbBytesRead == 0 ||cbBytesRead!=size) { if (GetLastError() == ERROR_BROKEN_PIPE) { THROW_LAST_ERROR("pipe disconnected"); } else { THROW_LAST_ERROR("read failed"); } } } void WinNamedPipe::internalWriteBytes(const void* buf,size_t size) { DWORD cbWritten; BOOL fSuccess = FALSE; fSuccess = WriteFile( _hPipe, // buf, // size, // &cbWritten, // NULL); // if (!fSuccess || size != cbWritten) { THROW_LAST_ERROR("WriteFile failed"); } }
рдмрдВрдж () рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рд░реНрд╡рд░ рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕рдХреЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯрдирд╛рдорд╛рдЗрдбрдкрд╛рдЗрдк (рд╣реИрдиреНрдбрд▓ рдкрд╛рдЗрдк) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрд╕ рдкрд░ рдирдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдмрдВрджрд╣реИрдВрдбрд▓ (рд╣реИрдиреНрдбрд▓ рдкрд╛рдЗрдк) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред CloseHandle рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЪреИрдирд▓ рдкрд░ рднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╛ рддреЛ рдПрдХ рдХрдиреЗрдХреНрдЯреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд╛рдЗрдк рдкрд░, рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЪреИрдирд▓ рдХреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ DisconnectNamedPipe рдФрд░ CloseHandle рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓реЛрдЬрд╝ рдкрд░ рд╣рдо рдПрдХ рдбрдореА рд╡рд┐рдзрд┐ рд╣реЛрдЧреАред
void WinNamedPipe::Close() { if(_server||_server_with_client) { DisconnectNamedPipe(_hPipe); CloseHandle(_hPipe); //May throw an exception if a debugger is attached to the process and handle is not valid } }
рдпрд╣ рднреА рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЙрд╕ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рднреА рдбреЗрдЯрд╛ рдкрдврд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдпрд╣ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЧреЗрдЯрд▓рд╛рд╕реНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ:
#define THROW_LAST_ERROR(e){ \ int error=GetLastError(); \ std::stringstream err; \ err<<e<<", GLE="<<error; \ throw std::runtime_error(err.str().data()); \ }
рднрд╛рдЧ 3. рдПрдХ рдпреВрдирд┐рдХреНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛ - PosixNamedPipe
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдкреЙрдЬрд╝рд┐рдХреНрд╕-рд╕рдВрдЧрдд рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдпреВрдирд┐рдХреНрд╕ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯ (рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ -
wiki.linuxformat.ru/index.php/LXF83 : Unix_API) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╣реАрдВ рднреА рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдордиреЗ рдкрде / tmp / рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЙрдХреЗрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рд▓реМрдЯреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╕реНрдерд╛рдиреАрдп рд╕реЙрдХреЗрдЯ рдХреЗ рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рдиреАрдп рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдХреЛрдИ рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ (рдХрдиреЗрдХреНрд╢рди рдиреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛)ред рдЗрд╕рд▓рд┐рдП, рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрде рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ - рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рднреЗрджреНрдпрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╣реАрдВ рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ (рдФрд░ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдмреЗрд╕рдиреЗрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛)ред рдпрд╣ рднреА рдЗрд╕ рддрдереНрдп рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде PosixNamedPipe рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП - рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо рдореЗрдВ рдХрдХреНрд╖рд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЦреБрд▓реЗ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
void PosixNamedPipe::open() { sock= socket(AF_UNIX, SOCK_STREAM, 0); if(sock == -1) { THROW_ERROR("Create_socket failed: "); } unlink(_name.c_str()); desc.sun_family = AF_UNIX; strcpy(desc.sun_path, _name.c_str()); if (bind(sock, (sockaddr*)&desc, sizeof(struct sockaddr_un)) == -1) { THROW_ERROR("Connection failed(bind): "); } if (listen(sock,SOMAXCONN) == -1) { THROW_ERROR("Connection failed(listen): "); } }
рдХрдиреЗрдХреНрдЯ () рдлрд╝рдВрдХреНрд╢рди рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ:
void PosixNamedPipe::connect() { sock= socket(AF_UNIX, SOCK_STREAM, 0); if(sock == -1) { THROW_ERROR("Create_socket failed: "); } desc.sun_family = AF_UNIX; strcpy(desc.sun_path, _name.c_str()); if (::connect(sock, (sockaddr*)&desc, sizeof(struct sockaddr_un)) == -1) { THROW_ERROR("Connection failed(connect): "); } }
рд╣рдорд╛рд░реЗ TK рдХреЗ рдЕрдиреБрд╕рд╛рд░ WaitForConnection () рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдореЗрдВ рдпрд╣рд╛рдБ рднреА рдмрд┐рдЧрд╛рдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред
PosixNamedPipe* PosixNamedPipe::WaitForConnection() { int client=accept(sock,NULL,NULL); if(client!=-1) return new PosixNamedPipe(client); else { THROW_ERROR("Accept error: "); } }
рдЗрд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рдЖрдо рд╣реИ:
PosixNamedPipe::PosixNamedPipe(int pipe) { sock=pipe; _server=false; memset(&desc, 0, sizeof(struct sockaddr_un)); }
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрд╛рдЗрдВрдб рдФрд░ :: рдХрдиреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкрдиреЗ рдЦреЗрддреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ sockaddr_un рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдорд╕реЗрдЯ рд▓рд╛рдЗрди (& desc, 0, sizeof (рд╕реНрдЯреНрд░рдХреНрдЪрд░ sockaddr_un) рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВ:
void PosixNamedPipe::internalReadBytes(void* buf,size_t size) { size_t ret=-1; if ((recv(sock, buf, size, MSG_WAITALL)) == -1) { THROW_ERROR("Error while reading: "); } } void PosixNamedPipe::internalWriteBytes(const void* buf,size_t size) { size_t ret=-1; if ((ret = send(sock, buf, size, 0)) == -1||ret!=size) { THROW_ERROR("Error while sending: "); } }
рдЪреИрдирд▓ рдХреНрд▓реЛрдЬрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдХреНрд▓рд╛рд╕ рдХрд╛ рд╕рд░реНрд╡рд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдФрд░ рдХреНрд▓реЛрдЬрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ):
void PosixNamedPipe::Close() { if(_server) unlink(desc.sun_path); close(sock); } PosixNamedPipe::~PosixNamedPipe() { this->Close(); }
рднрд╛рдЧ 4. рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрд╕реНрддрд░реАрдп рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рддреЛ, рдирд╛рдорд┐рдд рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп #ifdef _WIN32 рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рдХрд░реЗрдВрдЧреЗ:
//NamedPipe.h #pragma once #ifdef _WIN32 #include typedef WinNamedPipe NamedPipe; #else #include <unistd.h> #include typedef PosixNamedPipe NamedPipe; #endif
рдЕрдм рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдо "NamedPipe.h" #include рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдХреЛрдб рдХрд╛ рдирд╛рдо NamedPipe * рдХреНрд▓рд╛рдЗрдВрдЯ = рдирдпрд╛ NamedPipe ("NamedPipe.h", 0) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд╣рдд рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдереНрд░реЗрдб рдкреВрд▓ рдкреИрдЯрд░реНрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ рд╣реИ :: рдереНрд░реЗрдб рдФрд░ рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛: рдПрдХ рдПрдХрд▓ рдереНрд░реЗрдб рдореЗрдВ, рдПрдХ WaitForConnection () рдХреЙрд▓ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде NamedPipe рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ tbb :: concurrent_queue рдХреНрдпреВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рд╕реАрдзреЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
void NamedPipeServer::run() { NamedPipe* client; _pipe=new NamedPipe(_name, 1); try { _pipe->ConnectOrOpen(); } catch(const std::exception& e) { } while(_active) { try { client=_pipe->WaitForConnection(); _clients.push(client); } catch(const std::exception& e) { } } delete _pipe; }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрдХрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЦрд╛рд▓реА рдХреЛрд╖реНрдардХ рдХреЗ рд╕реНрдерд╛рди рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореИрдХреНрд░реЛрдЬрд╝ рд▓реЙрдЧрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдВ, рдЗрди рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдзрд┐рднрд╛рд░ рди рдбрд╛рд▓реЗрдВред
рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╣реИрдВрдбрд▓рдХреНрд▓рд╛рдЗрдВрдЯ (NamedPipe * рдХреНрд▓рд╛рдЗрдВрдЯ) рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рд╡рд░реНрдЧ рдореЗрдВ рдЖрднрд╛рд╕реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╡рд░реНрдЧ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ, рдирд┐рдореНрди рд▓реВрдк рдШреВрдорддрд╛ рд╣реИ:
void NamedPipeServer::workerProc() { NamedPipe* client; while(_active) if(_clients.try_pop(client)) { handleClient(client); } else boost::this_thread::sleep(boost::posix_time::milliseconds(100)); }
рд▓реВрдк рдореЗрдВ, рдзрд╛рдЧрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмреЗрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рд░реНрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрд╡рд░реНрдХрд░реНрд╕ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдереНрд░реЗрдбреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ:
void NamedPipeServer::Start() { _active=true; startWorkers(); } void NamedPipeServer::startWorkers() { for (size_t i = 0; i < _thread_pool_size; ++i) { boost::shared_ptr<boost::thread> thread(new boost::thread(boost::bind(&NamedPipeServer::workerProc, this))); _threads.push_back(thread); } boost::shared_ptr<boost::thread> dispatcher(new boost::thread(boost::bind(&NamedPipeServer::run,this))); _threads.push_back(dispatcher); }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рд╛рд░рдВрдн () рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╕рднреА рд╕рд░реНрд╡рд░ рдереНрд░реЗрдб рдХреЗ рдкреВрд░реНрдг рд╣реЛрдиреЗ рддрдХ рдЗрд╕реЗ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, JoinWorkers рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
void NamedPipeServer::JoinWorkers() { size_t size=_threads.size(); for (std::size_t i = 0; i < size; ++i) _threads[i]->join(); for (std::size_t i = 0; i < size; ++i) _threads[i].reset(); _threads.clear(); }
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдиреЗ рдирд╛рдорд╛рдВрдХрд┐рдд рдкрд╛рдЗрдк рд╕рд░реНрд╡рд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рд╣рдореЗрдВ рдмрдЪрд╛рдпрд╛ред
рд╕рд░реНрд╡рд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреЙрдк () рд╡рд┐рдзрд┐:
void NamedPipeServer::Stop() { _active=false; this->JoinWorkers(); }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдереНрд░реЗрдб "рдЙрда рдЬрд╛рдПрдЧрд╛"ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ WaitForConnection () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рд╣реИред
рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рд╕рдВрднрд╡ рд╣реИ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрдЧрд▓реЗ рдЧреНрд░рд╛рд╣рдХ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдЬреБрдбрд╝рддреЗ рд╣реИрдВ (рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рдж, рдЧреНрд░рд╛рд╣рдХ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ)ред
рд╕рдВрднрд╡ рдЕрд╡рд░реЛрдзрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ (рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ) рд╕рдорд╛рдзрд╛рди рд╕реНрдЯреЙрдк рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдкрд╛рдЗрдк рдирд╛рдордХ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдирд╛ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ WaitForConnection рдереНрд░реЗрдб рд▓реЙрдХ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрдзрд┐рдХ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп-рд╕реАрдорд╛ рдЬреЛрдбрд╝рдХрд░ WaitForConnection () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд┐рдВрдбреЛрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
WinNamedPipe* WinNamedPipe::WaitForConnection(unsigned int timeout) { if(_server) { OVERLAPPED lpOverlapped = {0}; lpOverlapped.hEvent = CreateEvent(0,1,1,0); if(ConnectNamedPipe(_hPipe, &lpOverlapped)==0) { if(GetLastError()==ERROR_PIPE_CONNECTED) if (!SetEvent(lpOverlapped.hEvent)) THROW_LAST_ERROR("AsyncWaitForConnection failed"); int result = WaitForSingleObject(lpOverlapped.hEvent,timeout); if (WAIT_OBJECT_0 == result) { HANDLE client=_hPipe; open(); return new WinNamedPipe(client); } else { return NULL; } } else { THROW_LAST_ERROR("AsyncWaitForConnection failed"); } } else { throw std::runtime_error("WaitForConnection is not supported on client pipe\n"); } }
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЙрд▓ рдХреЛ CreateNamedPipe рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреБрд▓реЗ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ () рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
_hPipe = CreateNamedPipe( (LPSTR)_name.data(), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // PIPE_TYPE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFFER_PIPE_SIZE, BUFFER_PIPE_SIZE, 0, NULL)
рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
PosixNamedPipe* PosixNamedPipe::WaitForConnection(unsigned int timeout) { int nsock; int retour; fd_set readf; fd_set writef; struct timeval to; FD_ZERO(&readf); FD_ZERO(&writef); FD_SET(sock, &readf); FD_SET(sock, &writef); to.tv_usec = timeout*1000; retour = select(sock+1, &readf, &writef, 0, &to); if (retour == 0) { return NULL; } if ( (FD_ISSET(sock, &readf)) || (FD_ISSET(sock,&writef))) { nsock = accept(sock, NULL, NULL); return new PosixNamedPipe(nsock); } else { throw std::runtime_error("invalid socket descriptor!\n"); } }
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рд╕ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЙрдк () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рдкреВрд░реЗ _clients рдХреА рдХрддрд╛рд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдЕрдирдЪрд╛рд╣реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрддрд╛рд░ рдореЗрдВ рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
NamedPipeServer::~NamedPipeServer(void) { this->Stop(); while(!_clients.empty()) { if(_clients.try_pop(_pipe)) delete _pipe; } }
рднрд╛рдЧ 5. рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдкреИрдо рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦреА рдЧрдИ рдереА, рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рджреЛ рдереНрд░реЗрдбреНрд╕ рдмрдирд╛ рд░рд╣реЗ рдереЗ рдЬреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдФрд░ рдЗрд╕реЗ 10 рд▓рд╛рдЗрди рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рдереЗред рдкреНрд░рд╡рд╛рд╣ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЪрдХреНрд░ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
void spamming_thread() { std::vector<std::string> words; words.push_back(std::string("one ")); words.push_back(std::string("two ")); words.push_back(std::string("three ")); words.push_back(std::string("four ")); words.push_back(std::string("five ")); words.push_back(std::string("six ")); words.push_back(std::string("seven ")); words.push_back(std::string("eight ")); words.push_back(std::string("nine ")); words.push_back(std::string("ten ")); NamedPipe client("NamedPipeTester",0); try { client.ConnectOrOpen(); for(int i=0;i<words.size();++i) { std::cout<<"sending "<<words[i]<<"\n"; size_t size=words[i].size(); client.WriteBytes(&size,sizeof(size)); client.WriteBytes(words[i].data(),size); } client.Close(); } catch(const std::runtime_error &e) { std::cout<<"Exception: "<<e.what()<<"\n"; } }
рдЕрдм рдПрдХ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
#pragma once #include "../NamedPipeServer.h" class SimpleServer: public NamedPipeServer { protected: void handleClient(NamedPipe* client); public: SimpleServer(const std::string &name):NamedPipeServer(name,1){}; ~SimpleServer(){}; }; void SimpleServer::handleClient(NamedPipe* client) { for(int i=0;i<10;++i) { try { size_t size; client->ReadBytes(&size,sizeof(size)); if(size>0) { char* message=new char[size]; client->ReadBytes(message,size);
рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ, рдЖрдзрд╛ рдорд┐рдирдЯ рд░реБрдХреЗрдВ рдФрд░ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
SimpleServer* s=new SimpleServer("NamedPipeTester"); s->Start(); boost::this_thread::sleep(boost::posix_time::milliseconds(30000)); delete s; system("pause");
рдирд┐рд╖реНрдХрд░реНрд╖ред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЫрд╣ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХреЛрдб рдХреЛ рд╕рд╣реА рдФрд░ рдкреВрд░рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЪреВрдВрдХрд┐ рд▓реЗрдЦ рдиреМрд╕рд┐рдЦрд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рдВрднрд╡ рд╣реИрдВред рд▓реЗрдЦрдХ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рдорд┐рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд╣реЛрдВрдЧреЗред
рдпрд╣ рд▓реЗрдЦ рд╡реНрдпрд╛рдкрдХ рд╣реЛрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИ, рдирд╛рдорд┐рдд рдкрд╛рдЗрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдЗрдЯ рд░реАрдб-рд░рд╛рдЗрдЯ рдореЛрдб / рдореИрд╕реЗрдЬрд┐рдВрдЧ рдореЛрдб рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдЖрдк рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб
github.com/xpavlov/libNamedPipe рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ