рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рдЧреЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рджреВрд╕рд░реЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд╕рдВрдж рд╣реИ, рд╕рд╛рде рд╣реА рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╢рд╛рдпрдж, рд▓реЗрдЦ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдкрд╣рд▓рд╛ рд▓реЗрдЦ - http://habrahabr.ru/post/209144/
рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░реЗрдВ
рдкрд░рд┐рдЪрдп
рдирдорд╕реНрддреЗ, рдореЗрд░рд╛ рдирд╛рдо рдЧреНрд▓реЗрди рдлрд┐рдбрд▓рд░ рд╣реИ рдФрд░ рдореИрдВ "рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдкрдиреЗ рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдВред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдордиреЗ рдЯреАрд╕реАрдкреА рдХреЗ рдмрдЬрд╛рдп рдпреВрдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд╣рдордиреЗ UDP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рддрд╛рдХрд┐ рдкреИрдХреЗрдЯреЛрдВ рдХреЗ рдкреБрди: рдкреНрд░рд╕рд╛рд░рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рджреЗрд░реА рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреЗрдВред
рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпреВрдбреАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдмреАрдПрд╕рдбреА рдХреА рдХреБрд░реНрд╕рд┐рдпрд╛рдВ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмреАрдПрд╕рдбреА рд╕реЙрдХреЗрдЯреНрд╕ (рдмрд░реНрдХрд▓реЗ рд╕реЙрдХреЗрдЯреНрд╕) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЙрдХреЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред
рдмреАрдПрд╕рдбреА рд╕реЙрдХреЗрдЯ "рд╕реЙрдХреЗрдЯ", "рдмрд╛рдЗрдВрдб", "рд╕реЗрдВрдбрдЖрдЙрдЯ" рдФрд░ "рд░рд┐рдХрд░реНрд╡рдлреНрд░реЗрдо" рдЬреИрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХрд╛ рдХреЛрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ OS рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдмреАрдПрд╕рдбреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдкрд╣рд▓рд╛ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рд╣рдо рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рд╛рд░ рд╕рднреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдЧрд╛ред
рд╡рд┐рднрд┐рдиреНрди рдУрдПрд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдУрдПрд╕ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЕрдВрддрд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХреЗрдВ:
рдЕрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕реЗрдЯ рд╡рд░реНрддрдорд╛рди рдУрдПрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд▓рд┐рдЦреЗ #define рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
#if PLATFORM == PLATFORM_WINDOWS #include <winsock2.h> #elif PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX #include <sys/socket.h> #include <netinet/in.h> #include <fcntl.h> #endif
UNIX рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░, рд╕реЙрдХреЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдорд╛рдирдХ рд╕рд┐рд╕реНрдЯрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╛рдЗрдирд╕реНрдХреЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рдЪрд╛рд▓ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдореЗрдХрдлрд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВ:
#if PLATFORM == PLATFORM_WINDOWS #pragma comment( lib, "wsock32.lib" ) #endif
рдореБрдЭреЗ рдпрд╣ рддрдХрдиреАрдХ рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЖрд▓рд╕реА рд╣реВрдВред рдмреЗрд╢рдХ, рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ рдореЗрдХрдлрд╛рдЗрд▓ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реЙрдХреЗрдЯ рдкреНрд░рд╛рд░рдВрдн
рдЕрдзрд┐рдХрд╛рдВрд╢ рдпреВрдирд┐рдХреНрд╕-рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (рдореИрдХреЛрд╕реИрдХреНрд╕ рд╕рд╣рд┐рдд) рдкрд░, рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЖрдкрдХреЛ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж "WSAStartup" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред - рдХреЙрд▓ "WSACleanup"ред
рдЖрдЗрдП рджреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:
inline bool InitializeSockets() { #if PLATFORM == PLATFORM_WINDOWS WSADATA WsaData; return WSAStartup( MAKEWORD(2,2), &WsaData ) == NO_ERROR; #else return true; #endif } inline void ShutdownSockets() { #if PLATFORM == PLATFORM_WINDOWS WSACleanup(); #endif }
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдкреВрд░реНрдгрддрд╛ рдХреЛрдб рд╣реИред рдЙрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЛрдб рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ
рдЕрдм рд╣рдо рдПрдХ рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
int handle = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( handle <= 0 ) { printf( "failed to create socket\n" ); return false; }
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 30000) рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рд╕реЙрдХреЗрдЯ рдХрд╛ рдЕрдкрдирд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдХреЛрдИ рдирдпрд╛ рдкреИрдХреЗрдЯ рдЖрддрд╛ рд╣реИ, рддреЛ рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╕реЙрдХреЗрдЯ рдХреЛ рдЖрдЧреЗ рднреЗрдЬрдирд╛ рд╣реИред 1024 рд╕реЗ рдЫреЛрдЯреЗ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ - рд╡реЗ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдХреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "0" рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдирд┐рд░реНрдмрд╛рдз рдкреЛрд░реНрдЯ рджреЗрдЧрд╛ред
sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( (unsigned short) port ); if ( bind( handle, (const sockaddr*) &address, sizeof(sockaddr_in) ) < 0 ) { printf( "failed to bind socket\n" ); return false; }
рдЕрдм рд╣рдорд╛рд░рд╛ рд╕реЙрдХреЗрдЯ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕ рд░рд╣рд╕реНрдпрдордп "htons" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ 16-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ - рд╡рд░реНрддрдорд╛рди (рдЫреЛрдЯреЗ рдпрд╛ рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди) рд╕реЗ рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк рд╕реАрдзреЗ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХрдИ рдмрд╛рд░ "htons" рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЗрд╕рдХреЗ 32-рдмрд┐рдЯ рдбрдмрд▓ - "htonl" рджреЗрдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред
рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЛ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдбрд╛рд▓рдирд╛
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕реЙрдХреЗрдЯ рддрдерд╛рдХрдерд┐рдд "рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдб" рдореЗрдВ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк "рд░рд┐рдХрд╡рд░рдлреНрд░реЙрдо" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рддрдм рддрдХ рдПрдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рд╕реЙрдХреЗрдЯ рдХреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдЦреЗрд▓ 30 рд╕реЗ 60 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ, рдФрд░ рдЦреЗрд▓ рдмрд╕ рд░реБрдХ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдЖрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ!
рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╕реЙрдХреЗрдЯ рдХреЛ "рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдб" рдореЗрдВ рдбрд╛рд▓рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдореЛрдб рдореЗрдВ, "recvfrom" рдлрд╝рдВрдХреНрд╢рди, рдпрджрд┐ рд╕реЙрдХреЗрдЯ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рддреБрд░рдВрдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ рдкрд░ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред
рдЖрдк рд╕реЙрдХреЗрдЯ рдХреЛ рдЧреИрд░-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX int nonBlocking = 1; if ( fcntl( handle, F_SETFL, O_NONBLOCK, nonBlocking ) == -1 ) { printf( "failed to set non-blocking socket\n" ); return false; } #elif PLATFORM == PLATFORM_WINDOWS DWORD nonBlocking = 1; if ( ioctlsocket( handle, FIONBIO, &nonBlocking ) != 0 ) { printf( "failed to set non-blocking socket\n" ); return false; } #endif
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рдВрдбреЛрдЬ рдкрд░ "fcntl" рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рд╛рде "ioctlsocket" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкреИрдХреЗрдЬ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ
рдпреВрдбреАрдкреА рдПрдХ рдХрдиреЗрдХреНрд╢рди рд░рд╣рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдкреИрдХреЗрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдкрддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреИрдХреЗрдЯ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рд╣реА рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕реЙрдХреЗрдЯ рдХреЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
int sent_bytes = sendto( handle, (const char*)packet_data, packet_size, 0, (sockaddr*)&address, sizeof(sockaddr_in) ); if ( sent_bytes != packet_size ) { printf( "failed to send packet: return value = %d\n", sent_bytes ); return false; }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Sendto рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдХреЗрд╡рд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдХреЛ рдЕрднрд┐рднрд╛рд╖рдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ! рдпреВрдбреАрдкреА рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреИрдХреЗрдЯ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЧрдВрддрд╡реНрдп рдкрд░ рдЖрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╣рдо рдЧрдВрддрд╡реНрдп рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ "sockaddr_in" рд╕рдВрд░рдЪрдирд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рдорд┐рд▓рддреА рд╣реИ?
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ рдкрддреЗ рдкрд░ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ 207.45.186.98ред 0000ред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдкрддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
unsigned int a = 207; unsigned int b = 45; unsigned int c = 186; unsigned int d = 98; unsigned short port = 30000;
рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдРрд╕реЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ Sendto рд╕рдордЭрддрд╛ рд╣реИ:
unsigned int destination_address = ( a << 24 ) | ( b << 16 ) | ( c << 8 ) | d; unsigned short destination_port = port; sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = htonl( destination_address ); address.sin_port = htons( destination_port );
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдП, рдмреА, рд╕реА, рдбреА (рдЬреЛ рдХрд┐ рд╕реАрдорд╛ [0, 255] рдореЗрдВ рд╣реИ) рдХреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдореВрд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдлрд┐рд░ рд╣рдо "htonl" рдФрд░ "htons" рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓рдХрд░, рдЕрдкрдиреЗ рдЧрдВрддрд╡реНрдп рдкрддреЗ рдФрд░ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде "sockaddr_in" рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред
рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдпрд╣ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдкреИрдХреЗрдЯ рдХреЛ рдЦреБрдж рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ 127.0.0.1 рдкрддреЗ (рд╕реНрдерд╛рдиреАрдп рд▓реВрдк рдХрд╛ рдкрддрд╛) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреИрдХреЗрдЯ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЬрдм рд╣рдо рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдХреЛ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдФрд░ рд╣рдорд╛рд░реЗ рд╕реЙрдХреЗрдЯ рдХреЗ рдкреЛрд░реНрдЯ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ "recvfrom" рдХреЛ рдПрдХ рд▓реВрдк рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рди рдлреЗрдВрдХреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдкреИрдХреЗрдЯ рдирд╣реАрдВ рдмрдЪреЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рдпреВрдбреАрдкреА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреИрдХреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рд╕реЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, "recvfrom" рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдкреНрд░реЗрд╖рдХ рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рдФрд░ рдкреЛрд░реНрдЯ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреИрдХреЗрдЯ рдХрд┐рд╕рдиреЗ рднреЗрдЬрд╛ рд╣реИред
рдПрдХ рд▓реВрдк рдореЗрдВ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:
while ( true ) { unsigned char packet_data[256]; unsigned int maximum_packet_size = sizeof( packet_data ); #if PLATFORM == PLATFORM_WINDOWS typedef int socklen_t; #endif sockaddr_in from; socklen_t fromLength = sizeof( from ); int received_bytes = recvfrom( socket, (char*)packet_data, maximum_packet_size, 0, (sockaddr*)&from, &fromLength ); if ( received_bytes <= 0 ) break; unsigned int from_address = ntohl( from.sin_addr.s_addr ); unsigned int from_port = ntohs( from.sin_port );
рдкреИрдХреЗрдЯ рдЬреЛ рдкреНрд░рд╛рдкреНрдд рдмрдлрд╝рд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдмрдбрд╝реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдмрд╕ рдЪреБрдкрдЪрд╛рдк рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 256 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдИ рдЖрдкрдХреЛ 300 рдмрд╛рдЗрдЯ рдХрд╛ рдкреИрдХреЗрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рдкреИрдХреЗрдЯ рд╕реЗ рд╕рд┐рд░реНрдл рдкрд╣рд▓реЗ 256 рдмрд╛рдЗрдЯ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рдЕрдкрдирд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдмрд╕ рд╣рдореЗрд╢рд╛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдФрд░ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкреИрдХреЗрдЯ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдмрдВрдж рд╕реЙрдХреЗрдЯ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ, рд╕реЙрдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рд╕реЙрдХреЗрдЯ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ "рдХреНрд▓реЛрдЬрд╝" рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдмрд╛рд╣рд░ рдЦрдбрд╝рд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ "рдХреНрд▓реЛрдЬрдмреЛрд░реНрдб" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX close( socket ); #elif PLATFORM == PLATFORM_WINDOWS closesocket( socket ); #endif
рдЗрд╕реЗ рд░рдЦреЛ, рд╡рд┐рдВрдбреЛрдЬ!
рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛: рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдирд╛, рдЗрд╕реЗ рдПрдХ рдмрдВрджрд░рдЧрд╛рд╣ рд╕реЗ рдмрд╛рдВрдзрдирд╛, рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛, рдкреИрдХреЗрдЯ рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдФрд░, рдЕрдВрдд рдореЗрдВ, рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред
рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпреЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рд░ рдмрд╛рд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬрдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рдЗрди рд╕рднреА рдХреЛ #ifdef рд▓рд┐рдЦрдирд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ "рд╕реЙрдХреЗрдЯ" рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдПрдбреНрд░реЗрд╕" рдХреНрд▓рд╛рд╕ рднреА рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ "sockaddr_in" рдХреЗ рд╕рд╛рде рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрдм рд╣рдо рдПрдХ рдкреИрдХреЗрдЯ рднреЗрдЬрдирд╛ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рддреЛ, рд╣рдорд╛рд░рд╛ рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕:
class Socket { public: Socket(); ~Socket(); bool Open( unsigned short port ); void Close(); bool IsOpen() const; bool Send( const Address & destination, const void * data, int size ); int Receive( Address & sender, void * data, int size ); private: int handle; };
рдФрд░ рдкрддрд╛ рд╡рд░реНрдЧ:
class Address { public: Address(); Address( unsigned char a, unsigned char b, unsigned char c, unsigned char d, unsigned short port ); Address( unsigned int address, unsigned short port ); unsigned int GetAddress() const; unsigned char GetA() const; unsigned char GetB() const; unsigned char GetC() const; unsigned char GetD() const; unsigned short GetPort() const; bool operator == ( const Address & other ) const; bool operator != ( const Address & other ) const; private: unsigned int address; unsigned short port; };
рд░рд┐рд╕реЗрдкреНрд╢рди рдФрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░реЗрдВ:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реАрдзреЗ рдмреАрдПрд╕рдбреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдФрд░ рдпрд╣ рдХреЛрдб рднреА рд╕рднреА OS рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЙрдХреЗрдЯ рдФрд░ рдПрдбреНрд░реЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддреА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ UDP рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдЙрдкрдХрд░рдг рд╣реИред
рдпреВрдбреАрдкреА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ
рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рдЬреЛ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЖрдИрдкреА рдкрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреИрдХреЗрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рдПрдХ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбред рд╣рд░ рдмрд╛рд░ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдкрддреЗ рдФрд░ рдкреЛрд░реНрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рднреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рдХрдИ рдиреЛрдб рдорд┐рд▓ рд╕рдХреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
> рдиреЛрдб 30000
> рдиреЛрдб 30001
> рдиреЛрдб 30002
рдЖрджрд┐ ...
рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбреНрд╕ рд╕рднреА рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЛ рдкреИрдХреЗрдЯ рдлреЙрд░рд╡рд░реНрдб рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдорд┐рдиреА рдкреАрдпрд░-рдЯреВ-рдкреАрдпрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рддрд░рд╣ рдХреБрдЫ рдмрдирд╛рдПрдВрдЧреЗред
рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ MacOSX рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реЗ рдУрдПрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред