β’ ΠΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ²ΡΠ΅ Π³ΡΠ°Π½ΠΈΡΡ. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π±Π°ΠΉΡΠΎΠ² ΠΌΠΎΠ³ΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΡΡΡΡ ΠΈ Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ°ΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ .
β’ ΠΠ°ΠΊΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠΎΡ ΡΠ°Π½ΡΡ Π³ΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈ Π΄ΠΎΡΡΠ°Π²Π»ΡΡ ΠΏΠΎΠ»Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»ΡΠΌ. ΠΠ°ΠΊΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΠ΅Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠ°.
Π₯ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ , Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΡΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠΈΠΏΠ° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ². ΠΠ΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΡΠ²Π»ΡΡΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ, Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΈ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ, Π½ΠΈ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΎΡΠΈΠ±ΠΎΠΊ. Π¨ΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» UDP, ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»Π΅ΠΌ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² TCP/IP. ΠΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ (ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ TCP ΠΈΠ· TCP/IP) β ΡΡΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΈ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΠ΅, ΠΈ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ Π²ΡΠΎΠ΄Π΅ UDP, Π½Π΅ΡΠΎΠΌΠ½Π΅Π½Π½ΠΎ, ΠΏΠΎΠ»Π΅Π·Π½Ρ[118], ΠΌΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΡ Π»Π΅Π³ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ Π²ΠΈΠ΄Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΊΠ½ΠΈΠ³Π°Ρ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, [33] ΠΈ [34].
17.1.4. ΠΠ΄ΡΠ΅ΡΠ°
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ°, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π°Π±ΡΡΡΠ°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π°Π΄ΡΠ΅ΡΠ°. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΡΠΎΡΠΌΡ Π°Π΄ΡΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° struct sockaddr; Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° Π°Π΄ΡΠ΅ΡΠΎΠ². ΠΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ struct sockaddr Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ², ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ°. Π’ΠΈΠΏ socklen_t ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠΈΡΠ»ΠΎ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ.
ΠΡΠ΅ ΡΠΈΠΏΡ struct sockaddr ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡ Π½ΠΈΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
#include <sys/socket.h>
struct sockaddr {
unsigned short sa_family;
char sa_data[MAXSOCKADDRDATA];
}
ΠΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° Π±Π°ΠΉΡΠ° (ΡΠ°Π·ΠΌΠ΅Ρ short) ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ Π°Π΄ΡΠ΅ΡΠΎΠ², ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ Π΄Π°Π½Π½ΡΠΉ Π°Π΄ΡΠ΅Ρ. ΠΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π°Π΄ΡΠ΅ΡΠ½ΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ Linux, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΡΠ°Π±Π». 17.1.
Π’Π°Π±Π»ΠΈΡΠ° 17.1. Π‘Π΅ΠΌΠ΅ΠΉΡΡΠ²Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ²
ΠΠ΄ΡΠ΅Ρ ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° AF_UNIX PF_UNIX ΠΠΎΠΌΠ΅Π½ Unix. AF_INET PF_INET TCP/IP (Π²Π΅ΡΡΠΈΡ 4). AF_INET6 PF_INET6 TCP/IP (Π²Π΅ΡΡΠΈΡ 6). AF_AX25 PF_AX25 AX.25, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π΄ΠΈΠΎΠ»ΡΠ±ΠΈΡΠ΅Π»ΡΠΌΠΈ. AF_IPX PF_IPX Novell IPX. AF_APPLETALK PF_APPLETALK AppleTalk DDS. AF_NETROM PF_NETROM NetROM, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π΄ΠΈΠΎΠ»ΡΠ±ΠΈΡΠ΅Π»ΡΠΌΠΈ.17.2. Π‘Π»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ: copyData() ΠΈ die(). Π€ΡΠ½ΠΊΡΠΈΡ copyData() ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΈΡ Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ (Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΈΠΌΠ΅ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ). Π€ΡΠ½ΠΊΡΠΈΡ die() Π²ΡΠ·ΡΠ²Π°Π΅Ρ perror() ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡ Π²Π²Π΅Π»ΠΈ ΠΎΠ±Π΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ°ΠΉΠ» sockutil.Ρ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ±ΡΡΠ°ΡΡΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅. ΠΠ»Ρ ΡΠΏΡΠ°Π²ΠΊΠΈ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΡΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
1: /* sockutil.Ρ */
2:
3: #include <stdio.h>
4: #include <stdlib.h>
5: #include <unistd.h>
6:
7: #include "sockutil.h"
8:
9: /* Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ perror() ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
10: void die(char * message) {
11: perror(message);
12: exit(1);
13: }
14:
15: /* ΠΠΎΠΏΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠ°ΠΉΠ»Π° 'from' Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°
16: 'to' Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΅ΡΠ»ΠΈ
17: ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π΄Π»Ρ ΠΎΠ±ΠΎΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ
18: Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π΅ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ. */
19: void copyData(int from, int to) {
20: char buf[1024];
21: int amount;
22:
23; while ((amount = read(from, buf, sizeof(buf))) > 0) {
24: if (write(to, buf, amount) != amount) {
25: die("write");
26: return;
27: }
28: }
29: if (amount < 0)
30: die("read");
31: }
17.3. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² Linux ΡΠΎΠΊΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ. ΠΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° socket(), ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. ΠΠΎΡΠ»Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠΊΠ΅ΡΠ° Π΄Π°Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² read() ΠΈ write(), ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ close() Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Ρ Π½ΠΈΠΌ.
Π Π½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠΊΠ΅ΡΠΎΠ² Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π°Π±ΡΡΡΠ°Π³ΠΈΡΠΎΠ²Π°Π½Π°, ΠΏΠΎ ΡΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΌΡ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΡ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²Π° ΡΠ°Π·Π΄Π΅Π»Π° ΠΏΠΎΡΠ²ΡΡΠ΅Π½Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Π² Π΄Π²ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°Ρ (Π΄ΠΎΠΌΠ΅Π½ Unix ΠΈ TCP/IP). ΠΠ΄Π΅ΡΡ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π½ΠΈΠΆΠ΅.
17.3.1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ°
ΠΠΎΠ²ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ socket(), ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΠΊΠ΅Ρ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΠΊΠ΅ΡΠ° Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ. ΠΠ° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π΅ΡΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΡΠΎΠΊΠ΅ΡΠ° ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π² Π½Π΅Π³ΠΎ.
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ open(), ΡΡΠ½ΠΊΡΠΈΡ socket() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π½ΡΡΠ΅ 0, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π»Π° ΠΌΠ΅ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΈΠ»ΠΈ ΡΠ°Π²Π½ΡΠΉ Π½ΡΠ»Ρ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡΡΠ½ΠΎ. Π’ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ.
ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π² ΡΠ°Π±Π». 17.1.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ type ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ: SOCK_STREAM, SOCK_DGRAM ΠΈΠ»ΠΈ SOCK_RAW.[119] ΠΠ΄Π΅ΡΡ SOCK_STREAM ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π°, a SOCK_DGRAM ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΈΠ· ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π°. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ SOCK_RAW ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΡΡΠΌΠΎ Π² Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΡΠ΄ΡΠΎΠΌ.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΡΠ΅ΡΠΎΠΌ Π²ΡΠ΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, Π²Π²Π΅Π΄Π΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ²ΡΠΌΠΈ Π΄Π²ΡΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠ°Π²Π½ΠΎ 0, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π°. Π ΡΠ°Π±Π». 17.2 ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ Π΄Π»Ρ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° PF_INET. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌΠΈ Π·Π΄Π΅ΡΡ ΡΡΠΈΡΠ°ΡΡΡΡ IPPROTO_TCP (ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ) ΠΈ IPPROTO_UDP (Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠΉ).
Π’Π°Π±Π»ΠΈΡΠ° 17.2. ΠΡΠΎΡΠΎΠΊΠΎΠ»Ρ IP
ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ IPPROTO_ICMP Internet Control Message Protocol (ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΡΠΈ Internet) Π΄Π»Ρ IPv4. IPPROTO_ICMPV6 Internet Control Message Protocol (ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΡΠΈ Internet) Π΄Π»Ρ IPv6. IPPROTO_IPIP Π’ΠΎΠ½Π½Π΅Π»ΠΈ IPIP IPPROTO_IPV6 ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ IPv6. IPPROTO_RAW ΠΠ°ΠΊΠ΅ΡΡ Raw IP. IPPROTO_TCP Transmission Control Protocol (TCP) (ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ). IPPROTO_UDP User Datagram Protocol (UDP) (ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ).17.3.2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ