แกแขแแขแแแก แแแกแแแ แแฆแแแฃแแแ แฉแแแ
แแฃแแแแฅแกแแก แแแขแแ แแแแ
แฒแแแแก
แแแแแ แแแ แแแฉแแแแแแแ แกแแแแฃแ แแก แคแแแฃแ แแจแ. แคแแแขแ แแแแก แฅแแแแ แฏแแญแแ แฅแแแแก แแแแแชแแแแก แแแแก, แ แแแแแแช แแฌแงแแแ แฎแแแก แแแ แแแแแแ. แแก แฃแแ แฃแแแแแงแแคแก แกแแแแแแแก แแแแฃแจแแแก แแแแ แแคแแแแแแ. แแแแฃแแแกแฎแแแแแ, แแก แฎแแแแ แฌแแแจแ 8000 แแแแฃแจแแก แกแแฉแฅแแ แแ. แแแแแชแแแแ แแแขแแก แกแแฆแ แแ, แ แแแแแกแแช แแงแแแแแแ แแแแแ แกแขแ แแแแ แแก แแฃแแแ แคแแแขแ แแแ, แแ แแก 16 แแแขแ (แแก แแ แแ แแก แแแแจแแแแแแแแแ; แแฃ แแกแฃแ แ, แจแแแแซแแแแ แแแฌแแ แแ แคแแแขแ แแแ, แ แแแแแแแช แแแฃแจแแแแแแ แฃแคแ แ แแแฆแแแ แแแขแแก แกแแฆแ แแแแ). แแแแแชแแแแแ แแแฏแแฃแคแแแฃแแแ 160 แแแแฃแจแแก แแแแแแ. แแแ แแแแ, แแแแแแฃแแ แแแแแ แแ แแก 320 แแแแขแแก แแแแ. แจแแแแแแ, แฉแแแ แแแฌแแแแ แแแแแชแแแแแก แแแแแ แแขแแ แแก แจแแงแแแแแจแ, แ แแแแแแช, แ แแแแกแแช แแแแแ แแฃแแแ, แแ แแก "แแแแญแแแ แแแแ" แแแแแชแแแแแแกแแแแก. แแ แแแแแแแขแ แแ แจแแแแฎแแแแแจแ, แแฃ แแแแแ แแแแก แแ แแก แแแแฆแแแแ แแแแ แแคแแแแแ แกแแฃแแ แแ - แจแแแแซแแแแ แแแแแแงแแแแ แแแแแ แแขแแ แ แแแแแแแก "แแแแแฆแแแแแ" แขแแแแก แกแแแแแแแ.
แแแแแ แแขแแ แแก แจแแแแแ, แกแแแแแแ แแแแแแแก แแแแแแแ แจแ, แ แแแแแแช แแแ แแแฅแแแแก แฉแแแแก 16-แแแขแแแ แแแแฃแจแแแก ฮผ-แแแแแแแก แแแฎแแแแแ (G.711 แกแขแแแแแ แขแ) แ แแ แแแขแแแแแแแ. แแแแแแแ แแก แแแแแกแแแแแแ แฉแแแ แฃแแแ แแแแฅแแก แแแฎแแแ แแ แแแแแก แแแแแชแแแแ แแแแแ. แแแแแแแ, แฉแแแ แจแแแแแซแแแ แแแแแแแขแแแแ แแแแแชแแแแแ แจแแแฃแแจแแแก แแแ แแจแ, แแฃ แแ แแแญแแ แแแแ แขแ แแคแแแแก แจแแแแฎแแ. แแแแ แแ แแฅ แกแแกแแ แแแแแแ แแแแแ แแแแก แแแแแงแแแแแ, แ แแแแแ Wireshark-แก แจแแฃแซแแแ แแฃแแแแก แ แแแ แแแฃแชแแ แแแ RTP แแแแแแแแแ แแฎแแแแ แแแจแแ, แ แแแแกแแช แแก แจแแแฃแแจแฃแแแ ฮผ-แแแแแแแก แแ a-แแแแแแแก แแแฎแแแแแ.
แแแแแ แแแแก แจแแแแแ, แแแแแชแแแแ แแกแฃแแฃแฅแ แแแแแแแ แแแแแแแแแ 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);
}
}
แจแแแแแแแแแ. แจแแแแแ แแ แแแ แแแแก แแแจแแแแ แจแแกแแซแแแแแแแ แแ แแแแแแฃแขแแ แแ. แแ แแ แแแ, แ แแแแ แช แแฎแแ แแแแแแแแแ. แฉแแแ แแแฌแงแแแ TSark-แก แจแแแแแแ แแ แแฃแแแแขแแแแ:
$ 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 แแแกแแแแ แแแแแ, แแแจแแ แแแแแ แจแแแแแ แแแแแ - แแ แแฎแ แแแ แชแแคแ แฃแแ แฎแแ แแกแฎแแก แฎแแแแแแ แแแแฃแแแแแชแแ.
แแแแแแแแ แกแขแแขแแแจแ แฉแแแ แแแกแฌแแแแแ แ แแแแ แแแแฌแแ แแ แกแแแฃแแแ แ แคแแแขแ แแแ - แแแแแแแขแแแ, แแ แฃแแแ แแก แฌแงแแแแแแ แแฅแแแ แจแแซแแแแ แแแแแแงแแแแ แแแแแ แกแขแ แแแแ แ แแ แ แแฎแแแแ แแฃแแแ แแ แแแแแแกแแแแก, แแ แแแแ แกแฎแแ แแแแแ แแขแฃแ แกแคแแ แแจแแช.
แฌแงแแ แ: www.habr.com