ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Алгоритм чтСния оглавлСния Π ΠŸΠ”ΠŸ

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_header () производится Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ структуры. cmd. pack_type задаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cmd. cmd задаСтся ΠΊΠ°ΠΊ RPDP_GET_PAGE, адрСс заполняСтся исходя ΠΈΠ· ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Π° Π΄Π»ΠΈΠ½Π° устанавливаСтся Π² 1. Π”Π°Π»Π΅Π΅ открываСтся Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²Ρƒ страниц, Π³Π΄Π΅ сначала производится ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ вызываСтся функция read_pages (), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Алгоритм чтСния оглавлСния Π ΠŸΠ”ΠŸ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΅Π·Π΄ ΠΏΡ€ΠΈΠ΅Ρ…Π°Π» Π² Π΄Π΅ΠΏΠΎ, ΠΈ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ стСндом ΠΈ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² двиТСния ΠΏΠΎΠ΅Π·Π΄Π° ΠΏΠΎ Wi-Fi, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ считываниС рСгистраций, находящихся Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Π ΠŸΠ”ΠŸ.

ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Рисунок 3.3.1 ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘Ρ€Π°Π·Ρƒ послС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

Листинг 3.3.1.

__fastcall TForm1: TForm1(TComponent* Owner).

: TForm (Owner).

{.

ProgName = L" ВСстированиС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° Π ΠŸΠ”ΠŸ" ;

Form1->Caption = ProgName;

rscodec_init (); //ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ rscodec.dll.

netlib_init (); //Π˜Π½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ использованиС Winsock DLL Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ WSAStartup ().

dev = new CEthDev ();

dev->open ();

}.

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ происходит netlib_init () ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Winsock, описанных Π²Ρ‹ΡˆΠ΅. Π”Π°Π»Π΅Π΅ происходит созданиС элСмСнта класса CEthDev ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ся функция, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°Ρ сСтСвоС взаимодСйствиС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π° open (). Π­Ρ‚Π° функция создаСт UDP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ udp_client (), описанной Π² Π½Π°Ρ‡Π°Π»Π΅ Π³Π»Π°Π²Ρ‹.

Листинг 3.3.2.

int CEthDev: open (int dev_no).

{.

//создаСтся сокСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, производится адрСсация ΠΈ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

sd = udp_client (&sa, SRC_IP_ADDR, 0);

setRecvBufSize (1024*1024*10);

return sd;

}.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вывСсти Π½Π° ΡΠΊΡ€Π°Π½ список всСх ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π½Π° Π ΠŸΠ”ΠŸ рСгистраций. Бписок выводится Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ StrGridRPDP[6] ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ «ΠžΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅» (BtnReadHeader).

Листинг 3.3.3.

void __fastcall TForm1: BtnReadHeaderClick (TObject *Sender).

{.

bool bResult;

igCountRPDP = 0;

Screen->Cursor = crHourGlass;

bResult = this->ReadHeader (); //ВызываСтся функция чтСния ОглавлСния.

Screen->Cursor = crDefault;

}.

//—————————————————————————————————————;

bool __fastcall TForm1: ReadHeader ().

{.

int ret_code, count;

reg_info_t *farr;

try {.

// ВыдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ страницу.

char *sys_page = new char[4096];

// Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅.

ginfo = (reg_info_t *) g_sys_page;

igCountRPDP = 0;

// Π¦ΠΈΠΊΠ» чтСния списка рСгистраций.

for (int block = 0; block < 10; block++).

{.

// Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ страницу (4096 Π±Π°ΠΉΡ‚).

for (int i = 0; i < 5; i++).

{.

ret_code = dev->get_header (sys_page, 1, block);

if (ret_code == 4096).

{.

break;

}.

if (i == 4).

{.

Application->MessageBoxW (L" Π ΠŸΠ”ΠŸ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚.", L" Ошибка", MB_OK);

return false;

}.

Sleep (50);

}.

for (int i = 0; i < 4094; i++).

{.

g_sys_page[(block*4094)+i] = sys_page[i]; //Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

}.

// Π² ΠΎΠ΄Π½ΠΎΠΉ страницС умСщаСтся 89 рСгистраций.

for (count=0;count<89;count++).

{.

if (is_free_cell (&ginfo[igCountRPDP+count])).

//if = 0xFF goto end_found.

{.

igCountRPDP = igCountRPDP + count;

// igCountRPDP счСтчик рСгистраций.

goto end_found;

}.

}.

igCountRPDP = igCountRPDP + count;

}.

end_found: //.

if (count > 0).

{.

this->FillStrGridRPDP (count);//Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ StrGrid ОглавлСниСм.

return true;

}.

delete [] sys_page;

}.

catch (String str).

{.

}.

return false;

}.

Ѐункция поиска послСднСй рСгистрации Π² ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅:

Листинг 3.3.4.

int TForm1: is_free_cell (void *faddr).

{.

unsigned int i;

unsigned char *b;

int free;

b = (unsigned char *)faddr;

free = 1;

for (i=0; i < sizeof (reg_info_t); i++).

{.

if (b[i] ≠ 0xFF).

{.

free = 0;

break;

}.

}.

return free;

}.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎΡ‚ Π ΠŸΠ”ΠŸ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π Π°Π·ΠΌΠ΅Ρ€ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π²Π΅Π½ 4096 Π±Π°ΠΉΡ‚. Π”Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ страницСй ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΎΠΌ. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReadHeader () создаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ sys_page Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 4096 Π±Π°ΠΉΡ‚ для хранСния ΠΎΠ΄Π½ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ происходит инициализация созданного глобально указатСля ginfo Π½Π° Ρ‚ΠΈΠΏ reg_info_t, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ.

Листинг 3.3.5.

struct reg_info_t.

{.

rtc_time_t rtc_time; // Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ врСмСнная информация.

rpdp_addr_tfaddr; // адрСс ΠΏΠ΅Ρ€Π²ΠΎΠΉ страницы рСгистрации.

unsigned int pages; // количСство страниц рСгисирации.

};

Π’ΠΈΠΏreg_info_t ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ…ΠΈΠ΄Π΅Ρ€Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ rpdr.h. Π­Ρ‚ΠΎ созданный Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ составной Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ. Он ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ адрСс ΠΏΠ΅Ρ€Π²ΠΎΠΉ страницы рСгистрации Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Π ΠŸΠ”ΠŸ faddr, количСство страниц pages, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽΡΡ Π² rtc_time Ρ‚ΠΈΠΏΠ° rtc_time_t.

Листинг 3.3.6.

//структура, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ врСмя создания рСгистрации.

struct rtc_time_t.

{.

int sec; // сСкунды.

int min; // ΠΌΠΈΠ½ΡƒΡ‚Ρ‹.

int hour;// часы.

int mday;// дСнь мСсяца.

int mon; // мСсяц.

int year;// Π³ΠΎΠ΄.

int wday;// дСнь нСдСли.

int yday;// дСнь года.

int days_ago;// ΠΏΡ€ΠΎΡˆΠ»ΠΎ Π΄Π½Π΅ΠΉ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° запуска.

};

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ производится Ρ†ΠΈΠΊΠ» чтСния 10 страниц (Π±Π»ΠΎΠΊΠΎΠ²). Ѐункция get_header (), опрСдСлСнная Π² ΠΊΠ»Π°ΡΡΠ΅ CEthDev, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡŒ страницы Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти sys_page ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘ Ρ€Π°Π·ΠΌΠ΅Ρ€. На Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ страницы ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ даСтся ΠΏΡΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ с ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ Π² 50 миллисСкунд. Если Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ Ρ„ункция get_header () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4096, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСниС «Π ΠŸΠ”ΠŸ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚». Ѐункция get_header () Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСна Π΄Π°Π»Π΅Π΅.

ΠŸΡ€ΠΈΠ½ΡΡ‚Π°Ρ страница записываСтся Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ массив всСх страниц оглавлСния g_sys_page[40 960] Ρ‚ΠΈΠΏΠ° unsigned char.

Π’ ΠΎΠ΄Π½ΠΎΠΉ принятой страницС оглавлСния умСщаСтся информация ΠΎ 89 рСгистрациях (адрСс ΠΏΠ΅Ρ€Π²ΠΎΠΉ страницы, количСство страниц, врСмСнная информация), Π½ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠ΅. Для подсчСта количСства рСгистраций Π² ΡΡ‚раницСоглавлСния вводится Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ igCountRPDP Ρ‚ΠΈΠΏΠ° int. ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ производится Π² Ρ†ΠΈΠΊΠ»Π΅ for () ΠΏΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ 89 рСгистрациям. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ΡΡ сущСствованиС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ рСгистрации с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_free_cell (). is_free_cell () ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π³Π΄Π΅ хранится информация ΠΎΠ± ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ рСгистрации, сравниваСт Π±Π°ΠΉΡ‚Ρ‹ памяти со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0xFF ΠΈ Π΅ΡΠ»ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ совпадСния, Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ пуста ΠΈ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли рСгистрация Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ сущСствуСт ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ рСгистрации Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ ΠΈΡ… ΠΏΠΎΠ΄ΡΡ‡Π΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° igCountRPDP, список рСгистраций выводится Π²StrGridRPDP с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ FillStrGridRPDP (). Ѐункция FillStrGridRPDP () заполняСт столбцы Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, записывая Ρ‚ΡƒΠ΄Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ (количСство страниц, Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² Π±Π°ΠΉΡ‚Π°Ρ…), Π° Ρ‚Π°ΠΊΠΆΠ΅ врСмя, ΠΊΠΎΠ³Π΄Π° эта рСгистрация Π±Ρ‹Π»Π° записана Π½Π° Π ΠŸΠ”ΠŸ.

ПослС ΠΎΠ±Ρ‰Π΅Π³ΠΎ описания процСсса считывания оглавлСния Π ΠŸΠ”ΠŸ, ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_header () ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ происходит считываниС страницы рСгистрации Π² Π±ΡƒΡ„Π΅Ρ€ sys_page.

ВзаимодСйствиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π ΠŸΠ”ΠŸ происходит Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ Π ΠŸΠ”ΠŸ страницу оглавлСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ этой страницы. БоотвСтствиС ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ описано Π² Ρ…ΠΈΠ΄Π΅Ρ€Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ rpdp.h. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄:

Листинг 3.3.7.

// ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cmd для Π ΠŸΠ”ΠŸ.

#define RPDP_GET_PAGE0 // ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ страницы Π ΠŸΠ”ΠŸ.

#define RPDP_ERASE_BLOCK 4 // стираниС Π±Π»ΠΎΠΊΠ° Π ΠŸΠ”ΠŸ.

#define RPDP_GET_TIME5 // ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π ΠŸΠ”ΠŸ.

#define RPDP_SET_TIME6 // установка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π ΠŸΠ”ΠŸ.

#define RPDP_PUT_PAGE9// запись бСз оТидания.

#define RPDP_GET_RAW_PAGE10 // ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ страниц Π ΠŸΠ”ΠŸ.

#define RPDP_GET_VERSION 14 // ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ вСрсии Π ΠŸΠ”ΠŸ ΠŸΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° Π ΠŸΠ”ΠŸ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ rpdp_cmd_t, Π³Π΄Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… пСрСчислСны Π²Ρ‹ΡˆΠ΅), адрСс Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ слова, Π΄Π»ΠΈΠ½Ρƒ сдвига ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Листинг 3.3.8.

struct rpdp_cmd_t.

{.

unsigned char pack_type;

unsigned int cmd;

unsigned int addr_lo;

unsigned int addr_hi;

unsigned int len;

unsigned charreserv[100];

};

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_header () производится Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ структуры. cmd. pack_type задаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cmd. cmd задаСтся ΠΊΠ°ΠΊ RPDP_GET_PAGE, адрСс заполняСтся исходя ΠΈΠ· ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Π° Π΄Π»ΠΈΠ½Π° устанавливаСтся Π² 1. Π”Π°Π»Π΅Π΅ открываСтся Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²Ρƒ страниц, Π³Π΄Π΅ сначала производится ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ вызываСтся функция read_pages (), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти ΠΏΠΎΠ΄ страницу sys_page. Π”Π°Π»Π΅Π΅ Π² Ρ†ΠΈΠΊΠ»Π΅ производится ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ адрСса ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, смСщСниС указатСля ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ страницы. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚.

Листинг 3.3.9.

intCEthDev:get_header (void *buf, unsigned int pages_count, int start_block).

{.

rpdp_cmd_t cmd;

int ret_code;

reg_info_t *farr;

rpdp_addr_tfaddr;

cmd.pack_type = PKT_CMD;

cmd.cmd = RPDP_GET_PAGE; // ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ страницы Π ΠŸΠ”ΠŸ.

cmd.addr_lo = 0;

cmd.addr_hi = (7 << 20) + (start_block << 8); // адрСс.

cmd.len = 1;

char *tmp_buf = (char *)buf;

for (int i = 0; i< pages_count; i++).

{.

send_cmd (&cmd);

ret_code = read_pages (tmp_buf, 1,5000);

cmd.addr_hi++;

tmp_buf += 4096;

}.

return ret_code;

}.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ Π ΠŸΠ”ΠŸ производится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ send_cmd ().Π‘Π½Π°Ρ‡Π°Π»Π° происходит инициализация структурыdest, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ указываСтся IP-адрСс ΠΏΡƒΠ½ΠΊΡ‚Π° назначСнияDST_IP_ADDR ="192.168.1.10″ ΠΈ ΠΏΠΎΡ€Ρ‚. Π”Π°Π»Π΅Π΅ производится ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cmd с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendto () Π² ΠΏΡƒΠ½ΠΊΡ‚ назначСния dest.

Листинг 3.3.10.

//ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция отправляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (cmd).

int CEthDev: send_cmd (rpdp_cmd_t *cmd).

{.

struct sockaddr_in dest;

int ret_code;

set_address (&dest, DST_IP_ADDR, DST_UDP_PORT);

ret_code = sendto (sd,(const char*)cmd, sizeof (rpdp_cmd_t), 0, (sockaddr*)&dest, sizeof (dest));

return ret_code;

}.

Ѐункция read_pages () Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ чтСния Π±Π°ΠΉΡ‚ read_bytes ().

Листинг 3.3.11.

//Ѐункция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ страницу ΠΈΠ· Π ΠŸΠ”ΠŸ, 1 страница — 4096.

int CEthDev: read_pages (void *data, int pages_count, int tout).

{.

unsigned char *b;

int ret_code;

b = (unsigned char *)data;

for (int i=0;i.

{.

ret_code = read_bytes (&b[i*4096], 4096, tout); //Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠΎ 4096 Π±Π°ΠΉΡ‚ Π·Π° Ρ€Π°Π·.

}.

return ret_code;

}.

//—————————————————————————————————————;

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read_bytes () создаСтся дСскриптор события recv_event, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WSAEventSelect () ассоциируСтся с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ сСтСвых событий, Π² Π½Π°ΡˆΠ΅ΠΌ случаС с ΡΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ΠΌ чтСния FD_READ.Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, послС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cmd Π½Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ рСгистрации, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ сСтСвого события FD_READ. Если событиС происходит Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° истСчСния Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° оТидания WAIT_TIMEOUT, вызываСтся функция recvfrom (). Ѐункция recvfrom () ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, записываСт Π΅Π΅ Π² Π±ΡƒΡ„Π΅Ρ€ sys_page ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство принятых Π±Π°ΠΉΡ‚. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom () Π΄Π°Π½ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ Π³Π»Π°Π²Ρ‹.

Листинг 3.3.12.

int CEthDev: read_bytes (void *data, int len, int tout).

{.

int fromlen;

struct sockaddr_in saddr;

int count;

count = -1;

//create an event object.

HANDLE recv_event = CreateEvent (0,0,0,0);

BOOL bSend = TRUE;

int iCnt;

WSAEventSelect (sd, recv_event, FD_READ);

DWORD dwRet = WaitForSingleObject (recv_event, tout);

if (dwRet ≠ WAIT_TIMEOUT).

{.

count = recvfrom (sd, (char*)data, len, 0, 0, 0);

}.

CloseHandle (recv_event);

return count;

}.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ