āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§āĻ° āĻāĻĒāĻžāĻĻāĻžāĻ¨ āĻāĻŽāĻžāĻ° āĻĨā§āĻā§ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻā§
āĻĄā§āĻĒā§āĻ˛ā§āĻā§āĻ¸ āĻāĻ¨ā§āĻāĻžāĻ°āĻāĻŽ
āĻļā§āĻˇā§
āĻāĻŋāĻ¤ā§āĻ°āĻāĻŋ āĻļāĻŋāĻ°ā§āĻ¨āĻžāĻŽ āĻāĻŋāĻ¤ā§āĻ°ā§ āĻĻā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋāĻ° āĻ¨ā§āĻā§āĻ° āĻā§āĻāĻ¨āĻāĻŋ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĒāĻžāĻĨ āĻāĻ āĻ¨ āĻāĻ°ā§, āĻ¯āĻž āĻ¸āĻžāĻāĻ¨ā§āĻĄ āĻāĻžāĻ°ā§āĻĄ āĻĨā§āĻā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻŋ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĢā§āĻ¨ āĻĨā§āĻā§ āĻ¸āĻāĻā§āĻ¤ āĻ¨āĻŽā§āĻ¨āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻāĻ°ā§āĻĒā§, āĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§ 8000 āĻ¨āĻŽā§āĻ¨āĻžāĻ° āĻšāĻžāĻ°ā§ āĻāĻā§āĨ¤ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻā§āĻ°āĻŋāĻŽāĻžāĻ° āĻ āĻĄāĻŋāĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋ āĻ¯ā§ āĻĄā§āĻāĻž āĻŦāĻŋāĻ āĻāĻā§āĻ°āĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¤āĻž āĻšāĻ˛ 16 āĻŦāĻŋāĻ (āĻāĻāĻŋ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻ¨āĻ¯āĻŧ; āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻžāĻ¨ āĻ¤āĻŦā§ āĻāĻĒāĻ¨āĻŋ āĻāĻŽāĻ¨ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻ˛āĻŋāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻ¯āĻž āĻāĻā§āĻāĻ¤āĻ° āĻŦāĻŋāĻ āĻāĻā§āĻ°āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻŦā§)āĨ¤ āĻĄā§āĻāĻž 160 āĻāĻŋ āĻ¨āĻŽā§āĻ¨āĻžāĻ° āĻŦā§āĻ˛āĻā§ āĻŦāĻŋāĻāĻā§āĻ¤āĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻŦā§āĻ˛āĻā§āĻ° āĻāĻāĻžāĻ° 320 āĻŦāĻžāĻāĻāĨ¤ āĻāĻ°āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻāĻ¨āĻĒā§āĻā§ āĻĄā§āĻāĻž āĻĢāĻŋāĻĄ āĻāĻ°āĻŋ, āĻ¯āĻž āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§ āĻā§āĻ˛ā§ āĻĄā§āĻāĻžāĻ¤ā§ "āĻ¸ā§āĻŦāĻā§āĻ" āĻšāĻ¯āĻŧāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻāĻ¯āĻŧā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĢā§āĻ¨ā§ āĻāĻĨāĻž āĻŦāĻ˛āĻ¤ā§ āĻŦāĻ˛āĻ¤ā§ āĻā§āĻ˛āĻžāĻ¨ā§āĻ¤ āĻšāĻ¯āĻŧā§ āĻĒāĻĄāĻŧā§āĻ¨ āĻ¤āĻŦā§ āĻāĻŽāĻŋ āĻāĻāĻŋ āĻ¯ā§āĻ āĻāĻ°ā§āĻāĻŋ - āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻā§āĻ¨ āĻ¸āĻāĻā§āĻ¤ āĻ¸āĻš āĻĒāĻĨ "āĻļā§āĻ" āĻāĻ°āĻ¤ā§ āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤
āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻĒāĻ°ā§, āĻ¸āĻāĻā§āĻ¤āĻāĻŋ āĻāĻ¨āĻā§āĻĄāĻžāĻ°ā§ āĻ¯āĻžāĻ¯āĻŧ, āĻ¯āĻž Âĩ-āĻ˛ (G.16 āĻŽāĻžāĻ¨) āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§ āĻāĻŽāĻžāĻĻā§āĻ° 711-āĻŦāĻŋāĻ āĻ¨āĻŽā§āĻ¨āĻžāĻā§ āĻāĻ-āĻŦāĻŋāĻ āĻ¨āĻŽā§āĻ¨āĻžāĻ¯āĻŧ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§āĨ¤ āĻāĻ¨āĻā§āĻĄāĻžāĻ°ā§āĻ° āĻāĻāĻāĻĒā§āĻā§, āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ āĻ āĻ°ā§āĻ§ā§āĻ āĻāĻāĻžāĻ°ā§āĻ° āĻĄā§āĻāĻž āĻŦā§āĻ˛āĻ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻāĻžāĻŦā§, āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¨āĻž āĻšāĻ˛ā§ āĻāĻŽāĻ°āĻž āĻāĻŽā§āĻĒā§āĻ°ā§āĻļāĻ¨ āĻāĻžāĻĄāĻŧāĻžāĻ āĻĄā§āĻāĻž āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻžāĻ¨ā§ āĻāĻāĻāĻŋ āĻāĻ¨āĻā§āĻĄāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻĒāĻ¯ā§āĻā§, āĻ¯ā§āĻšā§āĻ¤ā§ Wireshark āĻāĻāĻāĻŋ RTP āĻ¸ā§āĻā§āĻ°āĻŋāĻŽ āĻĨā§āĻā§ āĻ āĻĄāĻŋāĻ āĻĒā§āĻ¨āĻ°ā§āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻāĻ¨ āĻāĻāĻŋ Âĩ-law āĻŦāĻž a-law āĻ āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻ¸āĻāĻā§āĻāĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤
āĻāĻ¨āĻā§āĻĄāĻžāĻ°ā§āĻ° āĻĒāĻ°ā§, āĻĄā§āĻāĻžāĻ° āĻšāĻžāĻ˛āĻāĻž āĻŦā§āĻ˛āĻāĻā§āĻ˛āĻŋ rtpsend āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°ā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ¸ā§āĻā§āĻ˛āĻŋāĻā§ āĻāĻāĻāĻŋ RTP āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻ°āĻžāĻāĻŦā§, āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻāĻā§āĻ˛āĻŋ āĻ¸ā§āĻ āĻāĻ°āĻŦā§ āĻāĻŦāĻ āĻāĻāĻāĻŋ UDP āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻāĻžāĻ°ā§ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻā§ āĻ¸āĻāĻā§āĻ°āĻŽāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻā§āĻ°āĻŋāĻŽāĻžāĻ°āĻā§ āĻĻā§āĻŦā§ā§ˇ
āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋāĻ° āĻāĻĒāĻ°ā§āĻ° āĻā§āĻāĻ¨āĻāĻŋ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻĒāĻĨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§; āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻĨā§āĻā§ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻā§āĻ°āĻŋāĻŽāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ RTP āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§āĻ˛āĻŋ rtprecv āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°ā§ āĻĒā§āĻ°āĻŦā§āĻļ āĻāĻ°ā§, āĻ¯āĻžāĻ° āĻāĻāĻāĻĒā§āĻā§ āĻ¤āĻžāĻ°āĻž āĻĄā§āĻāĻž āĻŦā§āĻ˛āĻ āĻāĻāĻžāĻ°ā§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻŽāĻŋāĻ˛ā§ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻŦā§āĻ˛āĻāĻāĻŋāĻ¤ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒā§āĻ˛ā§āĻĄ āĻĄā§āĻāĻž āĻ°āĻ¯āĻŧā§āĻā§; āĻĒā§āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻāĻŋāĻ¤ā§āĻ°ā§ āĻ¸āĻŦā§āĻ āĻ°āĻā§ āĻĻā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻ° āĻĒāĻ°ā§, āĻŦā§āĻ˛āĻāĻā§āĻ˛āĻŋ āĻĄāĻŋāĻā§āĻĄāĻžāĻ° āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°ā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ¤āĻžāĻĻā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻĨāĻžāĻāĻž āĻāĻāĻ-āĻŦāĻžāĻāĻ āĻ¨āĻŽā§āĻ¨āĻžāĻā§āĻ˛āĻŋāĻā§ āĻ°ā§āĻāĻŋāĻ, 16-āĻŦāĻŋāĻāĻā§āĻ˛āĻŋāĻ¤ā§ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§āĨ¤ āĻ¯āĻž āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻā§āĻ°āĻŋāĻŽāĻžāĻ° āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻāĻŽāĻžāĻĻā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻāĻŽāĻ°āĻž āĻā§āĻŦāĻ˛ āĻāĻĒāĻ¨āĻžāĻ° āĻšā§āĻĄāĻ¸ā§āĻā§āĻ° āĻ¸ā§āĻĒāĻŋāĻāĻžāĻ°ā§āĻ° āĻĒā§āĻ˛ā§āĻŦā§āĻ¯āĻžāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¤āĻžāĻĻā§āĻ° āĻ¸āĻžāĻāĻ¨ā§āĻĄ āĻāĻžāĻ°ā§āĻĄā§ āĻĒāĻžāĻ āĻžāĻāĨ¤
āĻāĻāĻ¨ āĻ¸āĻĢā§āĻāĻāĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§āĻ° āĻĻāĻŋāĻā§ āĻāĻāĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻāĨ¤ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻ°āĻŋāĻ¸āĻŋāĻāĻžāĻ° āĻāĻŦāĻ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻāĻžāĻ° āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻā§ āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻāĻ°āĻŦ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻāĻā§ āĻāĻ˛āĻžāĻĻāĻž āĻāĻ°ā§āĻāĻŋāĨ¤ āĻāĻ° āĻāĻā§, āĻāĻŽāĻ°āĻž āĻĒā§āĻ°ā§āĻ āĻāĻŦāĻ āĻ āĻŋāĻāĻžāĻ¨āĻžāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ¸ā§āĻāĻŋāĻāĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤āĻžāĻŽ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸ā§āĻ āĻ¸ā§āĻāĻŋāĻāĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻ¸ā§āĻāĻžāĻ°ā§āĻāĻāĻĒā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻŋāĨ¤ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻāĻ¨ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻžāĻ°ā§āĻ¯āĻāĻžāĻ°āĻŋāĻ¤āĻž āĻ¯ā§āĻ āĻāĻ°āĻŦāĨ¤ āĻāĻ° āĻĒāĻ°ā§ āĻāĻŽāĻ°āĻž āĻ¯ā§ āĻāĻ¨ā§āĻāĻžāĻ°āĻāĻŽā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻāĻ¯ā§āĻ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻ¤ā§ āĻāĻžāĻ āĻ¤āĻžāĻ° IP āĻ āĻŋāĻāĻžāĻ¨āĻž āĻāĻŦāĻ āĻĒā§āĻ°ā§āĻ āĻ¸ā§āĻ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦāĨ¤
āĻĒā§āĻ°āĻĨāĻŽā§, āĻāĻ¸ā§āĻ¨ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻāĻžāĻ āĻžāĻŽā§ āĻ¯ā§āĻā§āĻ¤ āĻāĻ°āĻŋ āĻ¯āĻž āĻāĻāĻŋāĻ° āĻ¸ā§āĻāĻŋāĻāĻ¸ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻŦā§:
struct _app_vars
{
int local_port; /* ĐĐžĐēĐ°ĐģŅĐŊŅĐš ĐŋĐžŅŅ. */
int remote_port; /* ĐĐžŅŅ ĐŋĐĩŅĐĩĐŗОвОŅĐŊĐžĐŗĐž ŅŅŅŅОКŅŅва ĐŊĐ° ŅĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŧ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ. */
char remote_addr[128]; /* IP-Đ°Đ´ŅĐĩŅ ŅĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž ĐēĐžĐŧĐŋŅŅŅĐĩŅĐ°. */
MSDtmfGenCustomTone dtmf_cfg; /* ĐĐ°ŅŅŅОКĐēи ŅĐĩŅŅОвОĐŗĐž ŅиĐŗĐŊĐ°ĐģĐ° ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅĐ°. */
};
typedef struct _app_vars app_vars;
āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ āĻāĻ āĻ§āĻ°āĻŖā§āĻ° āĻāĻāĻāĻŋ āĻāĻžāĻ āĻžāĻŽā§ āĻā§āĻˇāĻŖāĻž āĻāĻ°āĻŦā§ āĻ¯āĻžāĻā§ vars āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻāĻ¨ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻĒāĻžāĻ°ā§āĻ¸ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāĻ¨ āĻ¯ā§āĻ āĻāĻ°āĻž āĻ¯āĻžāĻ:
/* ФŅĐŊĐēŅиŅ ĐŋŅĐĩОйŅаСОваĐŊиŅ Đ°ŅĐŗŅĐŧĐĩĐŊŅОв ĐēĐžĐŧĐ°ĐŊĐ´ĐŊОК ŅŅŅĐžĐēи в
* ĐŊĐ°ŅŅŅОКĐēи ĐŋŅĐžĐŗŅĐ°ĐŧĐŧŅ. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
}
}
āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻāĻ¯āĻŧā§āĻ° āĻĢāĻ˛ā§, āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻāĻ¨ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋ vars āĻāĻžāĻ āĻžāĻŽā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻāĻžāĻ āĻšāĻŦā§ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻāĻŋāĻ āĻāĻŦāĻ āĻ°āĻŋāĻ¸āĻŋāĻāĻŋāĻ āĻĒāĻžāĻĨ āĻ¸āĻāĻā§āĻ°āĻš āĻāĻ°āĻž; āĻāĻŋāĻāĻžāĻ° āĻ¸āĻāĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻĒāĻ°ā§, āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻāĻāĻāĻŋ āĻ āĻ¸ā§āĻŽ āĻ˛ā§āĻĒā§ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°āĻŋāĻ¤ āĻšāĻŦā§ āĻ¯āĻž, āĻ¯āĻĻāĻŋ āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻĢā§āĻ°āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸āĻŋ āĻ -āĻļā§āĻ¨ā§āĻ¯ā§ āĻ¸ā§āĻ āĻāĻ°āĻž āĻĨāĻžāĻā§, āĻ¤āĻžāĻšāĻ˛ā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ° āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻāĻžāĻ˛ā§ āĻāĻ°āĻŦā§ āĻ¯āĻžāĻ¤ā§ āĻāĻāĻž āĻŦāĻ¨ā§āĻ§ āĻāĻžāĻĄāĻŧāĻž āĻāĻžāĻ āĻāĻ°ā§āĨ¤
āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻĄāĻŋāĻāĻžāĻāĻ¨ā§āĻ° āĻāĻžāĻ°āĻŖā§ āĻāĻ āĻ°āĻŋāĻ¸ā§āĻāĻžāĻ°ā§āĻāĻā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻŦā§; āĻāĻŋāĻā§ āĻāĻžāĻ°āĻŖā§ āĻāĻāĻŋ 16 āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻŦā§āĻļāĻŋ āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻ¤ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻžāĨ¤ āĻāĻāĻŋ āĻ˛āĻā§āĻˇ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ āĻ¯ā§ āĻāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻāĻžāĻ˛ āĻāĻāĻāĻŋ 32-āĻŦāĻŋāĻ āĻ¨āĻŽā§āĻŦāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤
āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻāĻ āĻŽāĻ¤ āĻĻā§āĻāĻžāĻŦā§:
/* ФаКĐģ mstest8.c ĐĐŧиŅĐ°ŅĐžŅ ĐŋĐĩŅĐĩĐŗОвОŅĐŊĐžĐŗĐž ŅŅŅŅОКŅŅва. */
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>
/* ĐОдĐēĐģŅŅĐ°ĐĩĐŧ ŅĐ°ĐšĐģ ОйŅиŅ
ŅŅĐŊĐēŅиК. */
#include "mstest_common.c"
/*----------------------------------------------------------*/
struct _app_vars
{
int local_port; /* ĐĐžĐēĐ°ĐģŅĐŊŅĐš ĐŋĐžŅŅ. */
int remote_port; /* ĐĐžŅŅ ĐŋĐĩŅĐĩĐŗОвОŅĐŊĐžĐŗĐž ŅŅŅŅОКŅŅва ĐŊĐ° ŅĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŧ ĐēĐžĐŧĐŋŅŅŅĐĩŅĐĩ. */
char remote_addr[128]; /* IP-Đ°Đ´ŅĐĩŅ ŅĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž ĐēĐžĐŧĐŋŅŅŅĐĩŅĐ°. */
MSDtmfGenCustomTone dtmf_cfg; /* ĐĐ°ŅŅŅОКĐēи ŅĐĩŅŅОвОĐŗĐž ŅиĐŗĐŊĐ°ĐģĐ° ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅĐ°. */
};
typedef struct _app_vars app_vars;
/*----------------------------------------------------------*/
/* ХОСдаĐĩĐŧ Đ´ŅĐŋĐģĐĩĐēŅĐŊŅŅ RTP-ŅĐĩŅŅиŅ. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
rtp_session_set_send_payload_type(session, PCMU);
return session;
}
/*----------------------------------------------------------*/
/* ФŅĐŊĐēŅиŅ ĐŋŅĐĩОйŅаСОваĐŊиŅ Đ°ŅĐŗŅĐŧĐĩĐŊŅОв ĐēĐžĐŧĐ°ĐŊĐ´ĐŊОК ŅŅŅĐžĐēи в
* ĐŊĐ°ŅŅŅОКĐēи ĐŋŅĐžĐŗŅĐ°ĐŧĐŧŅ. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
}
}
/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
/* ĐŖŅŅĐ°ĐŊавĐģиваĐĩĐŧ ĐŊĐ°ŅŅŅОКĐēи ĐŋĐž ŅĐŧĐžĐģŅĐ°ĐŊиŅ. */
app_vars vars={5004, 7010, "127.0.0.1", {0}};
/* ĐŖŅŅĐ°ĐŊавĐģиваĐĩĐŧ ĐŊĐ°ŅŅŅОКĐēи ĐŊĐ°ŅŅŅОКĐēи ĐŋŅĐžĐŗŅĐ°ĐŧĐŧŅ в
* ŅООŅвĐĩŅŅŅвии Ņ Đ°ŅĐŗŅĐŧĐĩĐŊŅĐ°Đŧи ĐēĐžĐŧĐ°ĐŊĐ´ĐŊОК ŅŅŅĐžĐēи. */
scan_args(argc, argv, &vars);
ms_init();
/* ХОСдаĐĩĐŧ ŅĐēСĐĩĐŧĐŋĐģŅŅŅ ŅиĐģŅŅŅОв ĐŋĐĩŅĐĩĐ´Đ°ŅŅĐĩĐŗĐž ŅŅĐ°ĐēŅĐ°. */
MSSndCard *snd_card =
ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
/* ХОСдаĐĩĐŧ ŅиĐģŅŅŅ ĐēОдĐĩŅĐ°. */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
/* Đ ĐĩĐŗиŅŅŅиŅŅĐĩĐŧ ŅиĐŋŅ ĐŊĐ°ĐŗŅŅСĐēи. */
register_payloads();
/* ХОСдаĐĩĐŧ Đ´ŅĐŋĐģĐĩĐēŅĐŊŅŅ RTP-ŅĐĩŅŅиŅ. */
RtpSession* rtp_session= create_duplex_rtp_session(vars);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);
/* ĐĄĐžĐĩдиĐŊŅĐĩĐŧ ŅиĐģŅŅŅŅ ĐŋĐĩŅĐĩĐ´Đ°ŅŅиĐēĐ°. */
ms_filter_link(snd_card_read, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);
/* ХОСдаĐĩĐŧ ŅиĐģŅŅŅŅ ĐŋŅиĐĩĐŧĐŊĐžĐŗĐž ŅŅĐ°ĐēŅĐ°. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);
/* ХОСдаĐĩĐŧ ŅиĐģŅŅŅ Đ´ĐĩĐēОдĐĩŅĐ°, */
MSFilter *decoder=ms_filter_create_decoder("PCMU");
/* ХОСдаĐĩĐŧ ŅиĐģŅŅŅ СвŅĐēОвОК ĐēĐ°ŅŅŅ. */
MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);
/* ĐĄĐžĐĩдиĐŊŅĐĩĐŧ ŅиĐģŅŅŅŅ ĐŋŅиŅĐŧĐŊĐžĐŗĐž ŅŅĐ°ĐēŅĐ°. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, snd_card_write, 0);
/* ХОСдаĐĩĐŧ иŅŅĐžŅĐŊиĐē ŅĐ°ĐēŅОв - ŅиĐēĐĩŅ. */
MSTicker *ticker = ms_ticker_new();
/* ĐОдĐēĐģŅŅĐ°ĐĩĐŧ иŅŅĐžŅĐŊиĐē ŅĐ°ĐēŅОв. */
ms_ticker_attach(ticker, snd_card_read);
ms_ticker_attach(ticker, rtprecv);
/* ĐŅĐģи ĐŊĐ°ŅŅŅОКĐēĐ° ŅĐ°ŅŅĐžŅŅ ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅĐ° ĐžŅĐģиŅĐŊĐ° ĐžŅ ĐŊŅĐģŅ, ŅĐž СаĐŋŅŅĐēĐ°ĐĩĐŧ ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅ. */
if (vars.dtmf_cfg.frequencies[0])
{
/* ĐĐ°ŅŅŅаиваĐĩĐŧ ŅŅŅŅĐēŅŅŅŅ, ŅĐŋŅавĐģŅŅŅŅŅ вŅŅ
ОдĐŊŅĐŧ ŅиĐŗĐŊĐ°ĐģĐžĐŧ ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅĐ°. */
vars.dtmf_cfg.duration = 10000;
vars.dtmf_cfg.amplitude = 1.0;
}
/* ĐŅĐŗĐ°ĐŊиСŅĐĩĐŧ ŅиĐēĐģ ĐŋĐĩŅĐĩСаĐŋŅŅĐēĐ° ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅĐ°. */
while(TRUE)
{
if(vars.dtmf_cfg.frequencies[0])
{
/* ĐĐēĐģŅŅĐ°ĐĩĐŧ СвŅĐēОвОК ĐŗĐĩĐŊĐĩŅĐ°ŅĐžŅ. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&vars.dtmf_cfg);
}
/* ĐŖĐēĐģĐ°Đ´ŅваĐĩĐŧ ŅŅĐĩĐ´ в ŅĐŋŅŅĐēŅ ĐŊĐ° 20ĐŧŅ, ŅŅОйŅ Đ´ŅŅĐŗиĐĩ ŅŅĐĩĐ´Ņ
* ĐŋŅиĐģĐžĐļĐĩĐŊиŅ ĐŋĐžĐģŅŅиĐģи вŅĐĩĐŧŅ ĐŊĐ° ŅайОŅŅ. */
ms_usleep(20000);
}
}
āĻāĻ° āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°āĻž āĻ¯āĻžāĻ. āĻ¤āĻžāĻšāĻ˛ā§ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻĻā§āĻāĻŋ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāĻ°ā§ āĻāĻžāĻ˛āĻžāĻ¨ā§ āĻ¯āĻžāĻŦā§āĨ¤ āĻ āĻĨāĻŦāĻž āĻāĻā§āĻ° āĻāĻĒāĻ°, āĻāĻŽāĻŋ āĻāĻāĻ¨ āĻāĻ°āĻŦāĨ¤ āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻ¸āĻš TShark āĻāĻžāĻ˛ā§ āĻāĻ°āĻŋ:
$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x
āĻ¯āĻĻāĻŋ āĻāĻ¨āĻ¸ā§āĻ˛ā§ āĻ˛āĻā§āĻ āĻā§āĻˇā§āĻ¤ā§āĻ°āĻāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻā§āĻ¯āĻžāĻĒāĻāĻžāĻ°ā§āĻ° āĻļā§āĻ°ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°ā§, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻāĻŋāĻšā§āĻ¨ - āĻāĻ° āĻŽāĻžāĻ¨ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ°ā§āĻ āĻ¸āĻŽā§āĻāĻŦāĻ¤ āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĻāĻāĻ˛ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻ āĻ¨ā§āĻ¯ āĻāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛ā§, āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻāĻ¨āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§āĻ¸ āĻāĻžāĻ˛ā§ āĻāĻ°āĻŋ āĻ¯āĻž āĻāĻ āĻĒā§āĻ°ā§āĻ āĻ¨āĻŽā§āĻŦāĻ°āĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°ā§ āĻāĻāĻāĻŋ "āĻ°āĻŋāĻŽā§āĻ" āĻāĻ¨ā§āĻāĻžāĻ°āĻāĻŽ āĻ āĻ¨ā§āĻāĻ°āĻŖ āĻāĻ°āĻŦā§:
$ ./mstest8 --port 9010 --lport 7010
āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻĒāĻžāĻ ā§āĻ¯ āĻĨā§āĻā§ āĻĻā§āĻāĻž āĻ¯āĻžāĻ¯āĻŧ, āĻĄāĻŋāĻĢāĻ˛ā§āĻ āĻāĻāĻĒāĻŋ āĻ āĻŋāĻāĻžāĻ¨āĻž āĻšāĻ˛ 127.0.0.1 (āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻ˛ā§āĻĒāĻŦā§āĻ¯āĻžāĻ)āĨ¤
āĻ āĻ¨ā§āĻ¯ āĻāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛ā§, āĻāĻŽāĻ°āĻž āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻāĻāĻāĻŋ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤ āĻāĻžāĻ˛ā§ āĻāĻ°āĻŋ, āĻ¯āĻž āĻāĻāĻāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻĄāĻŋāĻāĻžāĻāĻ¸āĻā§ āĻ āĻ¨ā§āĻāĻ°āĻŖ āĻāĻ°ā§āĨ¤ āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻ¯ā§āĻā§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋ āĻ¯āĻž āĻŦāĻŋāĻ˛ā§āĻ-āĻāĻ¨ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ°āĻā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻ¯āĻŧ:
$ ./mstest8 --port 7010 --lport 9010 --gen 440
āĻāĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§, "āĻ°āĻŋāĻŽā§āĻ" āĻĄāĻŋāĻāĻžāĻāĻ¸ā§āĻ° āĻĻāĻŋāĻā§ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§āĻ˛āĻŋ āĻāĻŋāĻļāĻžāĻ°ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻ¨āĻ¸ā§āĻ˛ā§ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻļ āĻāĻ°āĻž āĻļā§āĻ°ā§ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ āĻāĻŦāĻ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāĻ° āĻ¸ā§āĻĒāĻŋāĻāĻžāĻ° āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻ° āĻļā§āĻ¨āĻž āĻ¯āĻžāĻŦā§āĨ¤
āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻāĻŋāĻā§ āĻ˛āĻŋāĻāĻŋāĻ¤āĻāĻžāĻŦā§ āĻāĻā§ āĻĨāĻžāĻā§, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻŽāĻ°āĻž āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋāĻ° āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻ āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋāĻāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻāĻžāĻ˛ā§ āĻāĻ°āĻŋ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻā§ āĻāĻŦāĻ āĻ¯ā§āĻā§āĻ¤āĻŋ "âāĻā§āĻ¨ 440" āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻ¨ āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻā§āĻŽāĻŋāĻāĻž āĻĒāĻžāĻ˛āĻ¨ āĻāĻ°āĻŦā§āĻ¨āĨ¤ āĻāĻ° āĻĒāĻ°ā§, āĻāĻĒāĻ¨āĻŋ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĢā§āĻ¨ā§ āĻļāĻŦā§āĻĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨; āĻāĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻĒāĻŋāĻāĻžāĻ° āĻŦāĻž āĻšā§āĻĄāĻĢā§āĻ¨āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ¸āĻāĻļā§āĻ˛āĻŋāĻˇā§āĻ āĻļāĻŦā§āĻĻ āĻļā§āĻ¨āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻ¨āĻāĻŋ āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻāĻŋāĻ āĻ¸ā§āĻŦ-āĻāĻ¤ā§āĻ¤ā§āĻāĻ¨āĻž āĻāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§; āĻ¸ā§āĻĒāĻŋāĻāĻžāĻ°ā§āĻ° āĻāĻ˛āĻŋāĻāĻŽ āĻŦāĻ¨ā§āĻ§ āĻāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻĒā§āĻ°āĻāĻžāĻŦāĻāĻŋ āĻ āĻĻā§āĻļā§āĻ¯ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻŦā§āĨ¤
āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻāĻŋ āĻĻā§āĻāĻŋ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāĻ°ā§ āĻāĻžāĻ˛āĻžāĻ¨ āĻāĻŦāĻ IP āĻ āĻŋāĻāĻžāĻ¨āĻžāĻā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦāĻŋāĻā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻ¨āĻž āĻšāĻ¨ āĻ¤āĻŦā§ āĻāĻāĻ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻāĻĒāĻ¨āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻž āĻāĻ°āĻā§ - āĻĻā§āĻŦāĻŋāĻŽā§āĻā§ āĻĄāĻŋāĻāĻŋāĻāĻžāĻ˛ āĻŽāĻžāĻ¨ā§āĻ° āĻāĻ¯āĻŧā§āĻ¸ āĻ¯ā§āĻāĻžāĻ¯ā§āĻāĨ¤
āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻāĻŽāĻ°āĻž āĻļāĻŋāĻāĻŦ āĻā§āĻāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° - āĻĒā§āĻ˛āĻžāĻāĻāĻ¨āĻā§āĻ˛āĻŋ āĻ˛āĻŋāĻāĻ¤ā§ āĻšāĻ¯āĻŧ, āĻāĻ āĻĻāĻā§āĻˇāĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ āĻāĻĒāĻ¨āĻŋ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻā§āĻ°āĻŋāĻŽāĻžāĻ°āĻāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ āĻĄāĻŋāĻ āĻāĻŦāĻ āĻāĻŋāĻĄāĻŋāĻāĻ° āĻāĻ¨ā§āĻ¯āĻ āĻ¨āĻ¯āĻŧ, āĻ āĻ¨ā§āĻ¯ āĻāĻŋāĻā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§āĻ¨āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com