ΠΠ°ΡΠ΅ΡΠΈΠ°Π» ΡΡΠ°ΡΡΠΈ Π²Π·ΡΡ Ρ ΠΌΠΎΠ΅Π³ΠΎ
ΠΡΠΏΠ»Π΅ΠΊΡΠ½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅Π³ΠΎΠ²ΠΎΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
Π ΠΏΡΠΎΡΠ»ΠΎΠΉ
Π‘Ρ Π΅ΠΌΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° Π·Π°Π³Π»Π°Π²Π½ΠΎΠΌ ΡΠΈΡΡΠ½ΠΊΠ΅. ΠΠΈΠΆΠ½ΡΡ ΡΠ΅ΠΏΡ ΡΠΈΠ»ΡΡΡΠΎΠ² ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠΈΠΉ ΡΡΠ°ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠΎ Π·Π²ΡΠΊΠΎΠ²ΠΎΠΉ ΠΊΠ°ΡΡΡ. ΠΠ½Π° Π²ΡΠ΄Π°Π΅Ρ ΠΎΡΡΡΠ΅ΡΡ ΡΠΈΠ³Π½Π°Π»Π° Ρ ΠΌΠΈΠΊΡΠΎΡΠΎΠ½Π°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΌΠΏΠ΅ 8000 ΠΎΡΡΡΠ΅ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. Π Π°Π·ΡΡΠ΄Π½ΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π·Π²ΡΠΊΠΎΠ²ΡΠ΅ ΡΠΈΠ»ΡΡΡΡ ΠΌΠ΅Π΄ΠΈΠ°ΡΡΡΠΈΠΌΠ΅ΡΠ° β 16 Π±ΠΈΡ ( ΡΡΠΎ Π½Π΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ, ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΈΠ»ΡΡΡΡ ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°Π·ΡΡΠ΄Π½ΠΎΡΡΡΡ). ΠΠ°Π½Π½ΡΠ΅ ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°Π½Ρ Π² Π±Π»ΠΎΠΊΠΈ ΠΏΠΎ 160 ΠΎΡΡΡΠ΅ΡΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π»ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ 320 Π±Π°ΠΉΡ. ΠΠ°Π»Π΅Π΅ ΠΌΡ ΠΏΠΎΠ΄Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π²Ρ ΠΎΠ΄ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π² Π²ΡΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ "ΠΏΡΠΎΠ·ΡΠ°ΡΠ΅Π½" Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ . Π― Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π½Π° ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅ Π½Π°Π΄ΠΎΠ΅ΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΡ Π² ΠΌΠΈΠΊΡΠΎΡΠΎΠ½ β Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠΌ, ΡΡΠΎΠ±Ρ "ΠΏΡΠΎΡΡΡΠ΅Π»ΠΈΡΡ" ΡΡΠ°ΠΊΡ ΡΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ.
ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΡΠΈΠ³Π½Π°Π» ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π½Π° ΠΊΠΎΠ΄Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π½Π°ΡΠΈ 16-Π±ΠΈΡΠ½ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡ ΠΏΠΎ Β΅-Π·Π°ΠΊΠΎΠ½Ρ (ΡΡΠ°Π½Π΄Π°ΡΡ G.711) Π² Π²ΠΎΡΡΠΌΠΈΠ±ΠΈΡΠ½ΡΠ΅. ΠΠ° Π²ΡΡ ΠΎΠ΄Π΅ ΠΊΠΎΠ΄Π΅ΡΠ° ΠΌΡ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΡΡ Π² Π΄Π²Π° ΡΠ°Π·Π° ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π±Π΅Π· ΡΠΆΠ°ΡΠΈΡ, Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ ΡΡΠ°ΡΠΈΠΊ. ΠΠΎ Π·Π΄Π΅ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠΎΠ΄Π΅ΡΠΎΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Wireshark ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ Π·Π²ΡΠΊ ΠΈΠ· RTP-ΠΏΠΎΡΠΎΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΡΠΆΠ°Ρ ΠΏΠΎ Β΅-Π·Π°ΠΊΠΎΠ½Ρ ΠΈΠ»ΠΈ Π°-Π·Π°ΠΊΠΎΠ½Ρ.
ΠΠΎΡΠ»Π΅ ΠΊΠΎΠ΄Π΅ΡΠ°, ΠΏΠΎΠ»Π΅Π³ΡΠ°Π²ΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ Π½Π° ΡΠΈΠ»ΡΡΡ 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
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ IP-Π°Π΄ΡΠ΅Ρ 127.0.0.1 (Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ»Ρ).
ΠΡΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π²ΡΠΎΡΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠΈΡΠΈΡΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°:
$ ./mstest8 --port 7010 --lport 9010 --gen 440
Π ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Ρ TShark Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠ°ΡΡ ΠΌΠ΅Π»ΡΠΊΠ°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π² ΡΡΠΎΡΠΎΠ½Ρ "ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ" ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π° ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° ΡΠ°Π·Π΄Π°ΡΡΡΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΉ ΡΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠΈΠ³Π½Π°Π».
ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎ ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ, ΡΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π²ΡΠΎΡΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½ΠΎ ΡΠΆΠ΅ Π±Π΅Π· ΠΊΠ»ΡΡΠ° ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° "—gen 440". Π ΠΎΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΡΠ΅ΠΏΠ΅ΡΡ Π±ΡΠ΄Π΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡ Π²Ρ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΌΠ΅ΡΡ Π² ΠΌΠΈΠΊΡΠΎΡΠΎΠ½, Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅ ΠΈΠ»ΠΈ Π½Π°ΡΡΠ½ΠΈΠΊΠ°Ρ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π·Π²ΡΠΊ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ Π°ΠΊΡΡΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°ΠΌΠΎΠ²ΠΎΠ·Π±ΡΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠ±Π°Π²ΡΡΠ΅ Π³ΡΠΎΠΌΠΊΠΎΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ° ΠΈ ΡΡΡΠ΅ΠΊΡ ΠΏΡΠΎΠΏΠ°Π΄Π΅Ρ.
ΠΡΠ»ΠΈ Ρ Π²Ρ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈ Π½Π° Π΄Π²ΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°Ρ ΠΈ Π½Π΅ Π·Π°ΠΏΡΡΠ°Π»ΠΈΡΡ Π² IP-Π°Π΄ΡΠ΅ΡΠ°Ρ , ΡΠΎ Π²Π°Ρ ΠΆΠ΄Π΅Ρ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ β Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΠ΅Π²Π°Ρ ΡΠ²ΡΠ·Ρ ΡΠΈΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ Π½Π°ΡΡΠΈΠΌΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΈΠ»ΡΡΡΡ β ΠΏΠ»Π°Π³ΠΈΠ½Ρ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ Π½Π°Π²ΡΠΊΡ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΌΠ΅Π΄ΠΈΠ°ΡΡΡΠΈΠΌΠ΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π·Π²ΡΠΊΠ° ΠΈ Π²ΠΈΠ΄Π΅ΠΎ, Π½ΠΎ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ½ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com