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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 106

Автор АндрСй РобачСвский

 while (1) {

  int addrlen;

  bzero(&clnt_addr, sizeof(clnt_addr));

  addrlen = sizeof(clnt_addr);

  /* ΠŸΡ€ΠΈΠΌΠ΅ΠΌ запрос. Новый сокСт ns становится

     ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ созданного Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° */

  if ((ns=accept(s, (struct sockaddr*)&clnt_addr,

   &addrlen))==-1) {

   perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° accept()");

   exit(1);

  }


  /* Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ */

  fprintf(stderr, "ΠšΠ»ΠΈΠ΅Π½Ρ‚ = %s\n",

   inet_ntoa(clnt_addr.sin_addr));

  /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ процСсс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ */

  if ((pid=fork())==-1) {

   perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° fork()");

   exit(1);

  }

  if (pid==0) {

   int nbytes;

   int fout;

   /* Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс: этот сокСт Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. Он

      ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния запросов */

   close(s);

   /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ */

   while ((nbytes = recv(ns, buf, sizeof(buf), 0)) !=0) {

    send(ns, buf, sizeof(buf), 0);

   }

   close(ns);

   exit(0);

  }

  /* Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс: этот сокСт Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. Он

     ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ процСссом для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ */

  close(ns);

 }

}

ΠšΠ»ΠΈΠ΅Π½Ρ‚

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>


/* НомСр ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обслуТиваСтся сСрвСром */

#define PORTNUM 1500


main (argc, argv)

char *argv[];

int argc;

{

 int s;

 int pid;

 int i, j;

 struct sockaddr_in serv_addr;

 struct hostent *hp;

 char buf[80]="Hello, World!";


 /* Π’ качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ пСрСдаСтся Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя

    хоста, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ сСрвСр. ΠŸΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ

    Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² адрСс */

 if ((hp = gethostbyname(argv[1])) == 0) {

  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° gethostbyname()");

  exit(3);

 }

 bzero(&serv_addr, sizeof(serv_addr));

 bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);

 serv_addr.sin_family = hp->h_addrtype;

 serv_addr.sin_port = htons(PORTNUM);


 /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ сокСт */

 if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° socket!)");

  exit(1);

 }

 fprintf(stderr, "АдрСс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°: %s\n",

  inet_ntoa(serv_addr.sin_addr));


 /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» */

 if (connect (s, (struct sockaddr*)&serv_addr,

  sizeof(serv_addr)) == -1) {

  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° connect()");

  exit(1);

 }


 /* ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ сСрвСру сообщСниС ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ */

 send(s, buf, sizeof(buf), 0);

 if (recv(s, buf, sizeof(buf) , 0) < 0) {

  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° recv()");

  exit(1);

 }


 /* Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ сообщСниС Π½Π° экран */

 printf("ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΎΡ‚ сСрвСра: %s\n", buf);

 close(s);

 printf("ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ \n\n");

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс TLI

ΠŸΡ€ΠΈ обсуТдСнии Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСтСвой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² BSD UNIX Π±Ρ‹Π» рассмотрСн ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс доступа ΠΊ сСтСвым рСсурсам, основанный Π½Π° сокСтах. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ описан интСрфСйс транспортного уровня (Transport Layer Interface, TLI), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт взаимодСйствиС ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с транспортными ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ.

TLI Π±Ρ‹Π» Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ прСдставлСн Π² UNIX System V Release 3.0 Π² 1986 Π³ΠΎΠ΄Ρƒ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс тСсно связан с сСтСвой подсистСмой UNIX, основанной Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ STREAMS, изолируя ΠΎΡ‚ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ особСнности сСтСвой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ нСпосрСдствСнно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ функциями STREAMS, рассмотрСнными Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅, TLI позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Для прСобразования Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² TLI Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ интСрфСйса STREAMS ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° TLI, которая Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм UNIX ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ libnsl.a ΠΈΠ»ΠΈ libnsl.so.

Π‘Ρ…Π΅ΠΌΠ° использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TLI Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ сходна с рассмотрСнным интСрфСйсом сокСтов ΠΈ зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° β€” с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ установлСниСм соСдинСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, TCP) ΠΈΠ»ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, UDP).

На рис. 6.18 ΠΈ 6.19 прСдставлСны схСмы использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TLI для транспортных ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ установлСниСм соСдинСния ΠΈ Π±Π΅Π· установлСния соСдинСния. МоТно ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти схСмы ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Ρ‚Π΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "ΠœΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅ΡΡΠ½ΠΎΠ΅ взаимодСйствиС Π² BSD UNIX. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹" Π³Π»Π°Π²Ρ‹ 3 ΠΏΡ€ΠΈ обсуТдСнии сокСтов. НСкоторыС различия ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈ описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TLI.

Рис. 6.18. Π‘Ρ…Π΅ΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TLI для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ установлСниСм соСдинСния

Рис. 6.19. Π‘Ρ…Π΅ΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TLI для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ установлСния соСдинСния

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

Для опрСдСлСния адрСса TLI прСдоставляСт ΠΎΠ±Ρ‰ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… netbuf, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ Π²ΠΈΠ΄:

struct netbuf {

 unsigned int maxlen;

 unsigned int len;

 char *buf;

}

ПолС buf ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π±ΡƒΡ„Π΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ адрСс ΡƒΠ·Π»Π°, maxlen опрСдСляСт Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, a len β€” количСство Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΡƒΡ„Π΅Ρ€Π΅, Ρ‚.Π΅. Ρ€Π°Π·ΠΌΠ΅Ρ€ адрСса. Π­Ρ‚Π° структура ΠΏΠΎ своСму Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° структуру sockaddr, которая являСтся ΠΎΠ±Ρ‰ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ адрСса ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° для сокСтов. Π”Π°Π»Π΅Π΅ рассматриваСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сСтСвого прилоТСния, основанного Π½Π° TLI, Π³Π΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ netbuf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ адрСса для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² TCP/IP.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° netbuf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² TLI для хранСния Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ адрСса, Π½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ β€” ΠΎΠΏΡ†ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚Π° структура являСтся составной Ρ‡Π°ΡΡ‚ΡŒΡŽ Π±ΠΎΠ»Π΅Π΅ слоТных структур Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² функциях TLI. Для упрощСния динамичСского размСщСния этих структур Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° TLI прСдоставляСт Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: t_alloc(3N) для размСщСния структуры ΠΈ t_free(3N) для освобоТдСния памяти. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

#include <tiuser.h>


char *t_alloc(int fd, int struct_type, int fields);

int t_free(char *ptr, int struct_type);

АргумСнт struct_type опрСдСляСт, для ΠΊΠ°ΠΊΠΎΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля struct_type Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… T_BIND struct t_bind T_CALL struct t_call T_DIS struct t_discon T_INFO struct t_info T_OPTMGMT struct t_optmgmt T_UNITDATA struct t_unitdata T_UDERROR struct t_uderr

Co структурами, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΌΡ‹ познакомимся ΠΏΡ€ΠΈ обсуТдСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TLI. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ… Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ нСсколько элСмСнтов netbuf. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ размСщСния всСх элСмСнтов netfuf, ΠΏΠΎΠ»Π΅ fields позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π±ΡƒΡ„Π΅Ρ€Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠΉ структуры:

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля fields Π Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ поля T_ALL ВсС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ поля T_ADDR ПолС addr Π² структурах t_bind, t_call, t_unitdata, t_uderr T_OPT ПолС opt Π² структурах t_call, t_unitdata, t_uderr, t_optmgmt T_UDATA ПолС udata Π² структурах t_call, t_unitdata, t_discon

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ ΠΎΠ΄Π½Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ. ЀактичСский Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ, соотвСтствСнно, структуры netbuf зависят ΠΎΡ‚ значСния поля maxlen этой структуры. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ поставщика транспортных услуг β€” ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ опрСдСляСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ адрСса, ΠΎΠΏΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эта информация ассоциирована с транспортным ΡƒΠ·Π»ΠΎΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° послС Π΅Π³ΠΎ создания с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ t_open(3N). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для опрСдСлСния фактичСского Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… структур Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ t_Π°lloc(3N) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ fd, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ дСскриптором транспортного ΡƒΠ·Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ возвращаСтся процСссу Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ t_open(3N).