Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 100

Автор ДТонсон Π₯Π°Ρ€Ρ‚

    ReportError(_T("Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² DLL"), 0, FALSE);

   }

  }

  if (dl_addr == NULL) { /* ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° внутрипроцСссного сСрвСра отсутствуСт. */

   /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ процСсс для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. */

   /* … Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² serverNP … */

  }

  /* … Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² serverNP … */

 } /* ΠšΠΎΠ½Π΅Ρ† основного ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. */

 /* ΠšΠΎΠ½Π΅Ρ† ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°. ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ рСсурсы; Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°. */ 

 _tprintf(_T("Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра# %d\n"), pThArg->number);

 shutdown(ConnectSock, 2);

 closesocket(ConnectSock);

 pThArg->status = 1;

 if (strcmp(Request.Record, "$ShutDownServer") == 0) {

  pThArg->status = 3;

  ShutFlag = TRUE;

 }

 return pThArg->status;

ЗамСчания ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ бСзопасности

Π’ Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ ΠΎΠ½Π° здСсь прСдставлСна, данная ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрная систСма Π½Π΅ являСтся бСзопасной. Если Π½Π° вашСй систСмС выполняСтся сСрвСр ΠΈ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ извСстСн Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅, ΠΈ имя ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π°Ρ‚Π°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ систСму. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, запустив ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° своСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, смоТСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π° вашСй систСмС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹.

ПолноС обсуТдСниС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² построСния бСзопасных систСм Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² Π³Π»Π°Π²Π΅ 15 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Windows, Π° Π² ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 12.14 прСдлагаСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ SSL.

ВнутрипроцСссныС сСрвСры

Как Ρ€Π°Π½Π΅Π΅ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, основноС ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ serverSK связано с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π² Π½Π΅Π΅ внутрипроцСссных сСрвСров. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 12.3 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ DLL, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ услуги ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ прСдставлСны Π΄Π²Π΅ ΡƒΠΆΠ΅ извСстныС Π²Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” функция, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π°Ρ подсчСт слов, ΠΈ функция toupper.

Π’ соотвСтствии с принятым соглашСниСм ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ являСтся командная строка, Π° Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ β€” имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, слСдуСт всСгда ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ сСрвСр, ΠΈ это Π΄ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ соблюдСния ТСстких Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ бСзопасности ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ, Π½ΠΎ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этим, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β€’ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ процСсса. НапримСр, Ссли ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ρ‚ΠΎ это ΠΎΠΊΠ°ΠΆΠ΅Ρ‚ воздСйствиС Π½Π° вСсь процСсс.

β€’ ΠΠ½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ стандартный Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄.

β€’ Π’Π°ΠΊΠΈΠ΅ ошибки программирования, ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄ индСкса ΠΈΠ»ΠΈ указатСля Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΠΎΡ€Ρ‡Π΅ памяти, относящСйся ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈΠ»ΠΈ самому процСссу. 

β€’ Π£Ρ‚Π΅Ρ‡ΠΊΠ° рСсурсов, возникшая, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ систСмС Π½Π΅ Π±Ρ‹Π»Π° своСврСмСнно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° освободившаяся ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ дСскрипторы, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, ΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ воздСйствиС Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ всСй сСрвСрной систСмы.

Π‘Ρ‚ΠΎΠ»ΡŒ ТСсткиС трСбования Π½Π΅ ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊ процСссам ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ процСсс, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ нанСсти ΡƒΡ‰Π΅Ρ€Π± Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссу, Π° послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ ΠΈΠΌ рСсурсы автоматичСски ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ. Π’ связи с этим слуТба, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, разрабатываСтся ΠΈ отлаТиваСтся ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ лишь послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ появится ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² надСТности Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΎΠ½Π° прСобразуСтся Π² DLL.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 12.3 прСдставлСна нСбольшая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DLL, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 12.3. command: ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСссных сСрвСров 

/* Π“Π»Π°Π²Π° 12. commands.с. */

/* ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ внутрипроцСссного сСрвСра для использования Π² serverSK ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. */

/* Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ нСсколько ΠΊΠΎΠΌΠ°Π½Π΄, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ DLLs. */

/* Ѐункция ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ обСспСчиваСт */

/* бСзопасноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ */

/* являСтся строка: ΠΊΠΎΠΌΠ°Π½Π΄Π° arg1 arg2 … argn */

/* (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ обычная командная строка), Π° Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ – имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. … */


static void extract_token(int, char *, char *);


_declspec(dllexport)

int wcip(char * command, char * output_file)

/* Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ слов; внутрипроцСссный. */

/* ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: упрощСнная вСрсия; Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ обСспСчиваСт ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° wc. */

{

 extract_token(1, command, input_file);

 fin = fopen(input_file, "r");

 /* … */

 ch = nw = nc = nl = 0;

 while ((c = fgetc(fin)) != EOF) {

  /* … Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ β€” для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅ являСтся сущСствСнным … */

 }

 fclose(fin);

 /* Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. */

 fout = fopen(output_file, "w");

 if (fout == NULL) return 2;

 fprintf(fout, " %9d %9d %9d %s\n", nl, nw, nc, input_file);

 fclose(fout);

 return 0;

}


_declspec(dllexport)

int toupperip(char * command, char * output_file)

/* ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру; выполняСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса. */

/* Вторая лСксСма Π·Π°Π΄Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» (пСрвая лСксСма – "toupperip"). */

{

 /* … */

 extract_token(1, command, input_file);

 fin = fopen(input_file, "r");

 if (fin == NULL) return 1;

 fout = fopen(output_file, "w");

 if (fout == NULL) return 2;

 while ((c = fgetc (fin)) != EOF) {

  if (c == '\0') break;

  if (isalpha(c)) с = toupper(c);

  fputc(c, fout);

 }

 fclose(fin);

 fclose(fout);

 return 0;

}


static void extract_token(int it, char * command, char * token) {

 /* Π˜Π·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ· "ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹" лСксСму Π½ΠΎΠΌΠ΅Ρ€ "it" (Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ лСксСмы */

 /* являСтся "0"). Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² "лСксСму" (token) */

 /* Π’ качСствС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ лСксСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹. … */

 return;

ΠžΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° строки сообщСния, Ρ‚ΠΎΡ‡ΠΊΠΈΠ² Ρ…ΠΎΠ΄Π° DLL ΠΈ TLS

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ serverSK ΠΈ clientSK Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ собой, обмСниваясь сообщСниями, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоит ΠΈΠ· 4-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, содСрТащСго Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния, ΠΈ собствСнно содСрТимого. ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ слуТат сообщСния, отдСляСмыС Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° символами ΠΊΠΎΠ½Ρ†Π° строки (ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки).

Π’Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°ΠΊΠΈΠΌΠΈ сообщСниями Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π° сообщСния Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ извСстна, Π² связи с Ρ‡Π΅ΠΌ приходится ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΉ символ. Однако ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ символу Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΊΡ€Π°ΠΉΠ½Π΅ нСэффСктивно, ΠΈ поэтому символы ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Π±ΡƒΡ„Π΅Ρ€Π΅, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько символов ΠΊΠΎΠ½Ρ†Π° строки ΠΈ составныС части ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сообщСний. ΠŸΡ€ΠΈ этом Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ°Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ получСния сообщСний Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ содСрТимоС ΠΈ состояниС Π±ΡƒΡ„Π΅Ρ€Π°. Π’ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС для этой Ρ†Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ячСйки ΡΡ‚атичСской памяти, Π½ΠΎ совмСстноС использованиС нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π’ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ΅, ΠΌΡ‹ сталкиваСмся здСсь с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ сохранСния Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… состояний Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС (multithreaded persistent state problem). Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° бСзопасная Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ выполнСния функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ сохранСниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Вакая ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ strtook, входящСй Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π‘, которая ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для просмотра строки для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ нахоТдСния экзСмпляров ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ лСксСмы.

РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… состояний Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС

Π’ искомом Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ΡΡ нСсколько ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

β€’ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DLL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТатся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ сообщСний.

β€’ Π€ΡƒΠ½ΠΊΡ†ΠΈΡ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° Π² DLL.

β€’ Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ хранСния ΠΏΠΎΡ‚ΠΎΠΊΠ° (TLS, Π³Π»Π°Π²Π° 7). ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ процСсса ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ сопровоТдаСтся созданиСм индСкса DLL, Π° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСкса хранится Π² статичСском Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΈΠΌΠ΅ΡŽΡ‚ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

β€’ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° распрСдСляСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ Π΅Π³ΠΎ адрСс сохраняСтся Π² записи TLS для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΡ€ΠΈ отсоСдинСнии ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ, занимаСмая Π΅Π³ΠΎ структурой, освобоТдаСтся.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, TLS ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ статичСского Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, ΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° имССтся собствСнная ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ копия этого Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: бСзопасная многопоточная DLL для ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями Ρ‡Π΅Ρ€Π΅Π· сокСт

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 12.4 прСдставляСт собой DLL, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… строк (Π² ΠΈΠΌΠ΅Π½Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² Π΄Π°Π½Π½ΠΎΠΌ случаС присутствуСт "CS", ΠΎΡ‚ character string β€” строка символов), ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сокСта (socket streaming functions): SendCSMessage ΠΈ ReceiveCSMessage, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° DllMain (см. Π³Π»Π°Π²Ρƒ 5). Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Ρ‚Ρƒ ΠΆΠ΅ Ρ€ΠΎΠ»ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ функция ReceiveMessage, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… 12.1 ΠΈ 12.2, ΠΈ фактичСски Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΡ….