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_uderrCo ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ΅, ΠΌΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ 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).