38: ptr = argv + 1;
39: while (*ptr && *ptr[0] == '-') {
40: if (!strcmp(*ptr, "βnumerichost")) {
41: flags |= NI_NUMERICHOST;
42: } else if (!strcmp (*ptr, "--numericserv")) {
43: flags |= NI_NUMERICSERV;
44: } else if (!strcmp (*ptr, "--namereqd")) {
45: flags |= NI_NAMEREQD;
46: } else if (!strcmp(*ptr, "--nofqdn")) {
47: flags |= NI_NOFQDN;
48: } else if (!strcmp (*ptr, "--udp")) {
49: flags |= NI_DGRAM;
50: } else if (!strcmp(*ptr, "--host")) {
51: ptr++;
52: if (!*ptr) usage();
53: hostAddress = *ptr;
54: } else if (!strcmp(*ptr, "--service")) {
55: ptr++;
56: if (!*ptr) usage();
57: serviceAddress = *ptr;
58: } else
59: usage();
60:
61: ptr++;
62: }
63:
64: /* Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ Π°Π΄ΡΠ΅ΡΠ° hostAddress, serviceAddress ΠΈΠ»ΠΈ ΠΎΠ±Π° */
65: if (!hostAddress && !serviceAddress)
66: usage();
67:
68: if (serviceAddress) {
69: char * end;
70:
71: portNum = htons(strtol(serviceAddress, &end, 0));
72: if (*end) {
73: fprintf(stderr, "ΡΠ±ΠΎΠΉ ΠΏΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΈ %s Π² ΡΠΈΡΠ»ΠΎ\n",
74: serviceAddress);
75: return 1;
76: }
77: }
78:
79: if (!hostAddress) {
80: addr4.sin_family = AF_INET;
81: addr4.sin_port = portNum;
82: } else if (!strchr(hostAddress, ':')) {
83: /* ΠΡΠ»ΠΈ hostAddress ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΠ΅, ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ Π²Π΅ΡΡΠΈΡ IPv6.
84: Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ IPv4 */
85:
86: if (inet_pton(AF_INET, hostAddress,
87: &addr4.sin_addr) <= 0) {
88: fprintf(stderr, "ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ IPv4-Π°Π΄ΡΠ΅ΡΠ° %s\n",
89: hostAddress);
90: return 1;
91: }
92:
93: addr4.sin_family = AF_INET;
94: addr4.sin_port = portNum;
95: } else {
96:
97: memset(&addr6, 0, sizeof(addr6));
98:
99: if (inet_pton(AF_INET6, hostAddress,
100: &addr6.sin6_addr) <= 0) {
101: fprintf(stderr, "ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ IPv6-Π°Π΄ΡΠ΅ΡΠ° %s\n",
102: hostAddress);
103: return 1;
104: }
105:
106: addr6.sin6_family = AF_INET6;
107: addr6.sin6_port = portNum;
108: addr = (struct sockaddr *) &addr6;
109: addrLen = sizeof(addr6);
110: }
111:
112: if (!serviceAddress) {
113: rc = getnameinfo(addr, addrLen, hostName, sizeof(hostName),
114: NULL, 0, flags);
115: } else if (!hostAddress) {
116: rc = getnameinfo(addr, addrLen, NULL, 0,
117: serviceName, sizeof(serviceName), flags);
118: } else {
119: rc = getnameinfo(addr, addrLen, hostName, sizeof(hostName),
120: serviceName, sizeof(serviceName), flags);
121: }
122:
123: if (rc) {
124: fprintf(stderr, "ΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°: %s\n",
125: gai_strerror(rc));
126: return 1;
127: }
128:
129: if (hostAddress)
130: printf("ΠΈΠΌΡ Ρ ΠΎΡΡΠ°: %s\n", hostName);
131: if (serviceAddress)
132: printf("ΠΈΠΌΡ ΡΠ»ΡΠΆΠ±Ρ: %s\n", serviceName);
133:
134: return 0;
135: }
17.5.7. ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ TCP-ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ TCP ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ Π΄ΠΎΠΌΠ΅Π½Π° Unix. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π°Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ². ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎΠΌΠ΅Π½Π° Unix, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΠΎΠΊΠ΅ΡΡ TCP.
1: /* tserver.Ρ */
2:
3: /* ΠΠΆΠΈΠ΄Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅ 4321. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ,
4: ΠΈΠ· ΡΠΎΠΊΠ΅ΡΠ° Π² stdout ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π²ΡΠΎΡΠ°Ρ
5: ΡΡΠΎΡΠΎΠ½Π° Π½Π΅ Π·Π°ΠΊΡΠΎΠ΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΠ°ΡΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
6: Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ. */
7:
8: #include <arpa/inet.h>
9: #include <netdb.h>
10: #include <netinet/in.h>
11: #include <stdio.h>
12: #include <string.h>
13: #include <sys/socket.h>
14: #include <unistd.h>
15:
16: #include "sockutil.h" /* Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ */
17:
18: int main(void) {
19: int sock, conn, i, rc;
20: struct sockaddr address;
21: size_t addrLength = sizeof(address);
22: struct addrinfo hints, * addr;
23:
24: memset(&hints, 0, sizeof(hints));
25:
26: hints.ai_socktype = SOCK_STREAM;
27: hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
28: if ((rc = getaddrinfo(NULL, "4321", &hints, &addr))) {
29: fprintf(stderr, "ΡΠ±ΠΎΠΉ ΠΏΠΎΠΈΡΠΊΠ° ΠΈΠΌΠ΅Π½ΠΈ Ρ ΠΎΡΡΠ°: %s\n",
30: gai_strerror(rc));
31: return 1;
32: }
33:
34: if ((sock = socket(addr->ai_family, addr->ai_socktype,
35: addr->ai_protocol)) < 0)
36: die("socket");
37:
38: /* ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄ΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π΄ΡΠ΅Ρ ΡΠΎΠΊΠ΅ΡΠ°. ΠΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ
39: Π½Π°ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π²Π° ΡΠ°Π·Π° ΠΏΠΎΠ΄ΡΡΠ΄, Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ ΠΏΠΎΠΊΠ° ΠΈΡΡΠ΅ΡΠ΅Ρ
40: Π²ΡΠ΅ΠΌΡ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΆΠ° (ip-Π°Π΄ΡΠ΅Ρ, ΠΏΠΎΡΡ). */
41: i = 1;
42: setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
43:
44: if (bind(sock, addr->ai_addr, addr->ai_addrlen))
45: die("bind");
46:
47: freeaddrinfo(addr);
48:
49: if (listen(sock, 5))
50: die("listen");
51:
52: while ((conn = accept(sock, (struct sockaddr *) &address,
53: &addrLength)) >=0) {
54: printf("----ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ \n");
55: copyData(conn, 1);
56: printf("----Π³ΠΎΡΠΎΠ²ΠΎ\n");
57: close(conn);
58: }
59:
60: if (conn < 0)
61: die("accept");
62:
63: close(sock);
64: return 0;
65: }
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ IP-Π°Π΄ΡΠ΅Ρ, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΊ ΡΠΎΠΊΠ΅ΡΡ, ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° 4321, Π½ΠΎ Π½Π΅ IP-Π°Π΄ΡΠ΅Ρ. ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ IP-Π°Π΄ΡΠ΅ΡΠΎΠΌ.
ΠΠΎΠ΄ Π² ΡΡΡΠΎΠΊΠ°Ρ 41β42 ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΡ.
41: i = 1;
42: setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
Linux-ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ TCP, ΠΊΠ°ΠΊ ΠΈ Π² ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Unix, Π²Π²ΠΎΠ΄ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠΎΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΡΡΠ΅ΠΆ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ Ρ ΠΎΡΡ, Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡ)[136]. ΠΡΠΎΡ ΠΊΠΎΠ΄ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΎΠΏΡΠΈΡ Π½Π° ΡΠΎΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡ ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π²Π°ΠΆΠ΄Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π·Π° ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎ ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ ΡΠ΅ΡΠ²Π΅Ρ-ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠΊΠ΅ΡΠ° Π΄ΠΎΠΌΠ΅Π½Π° Unix ΡΠ΄Π°Π»ΡΠ΅Ρ Π»ΡΠ±ΠΎΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» ΡΠΎΠΊΠ΅ΡΠ°, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ bind().
Π€ΡΠ½ΠΊΡΠΈΡ setsockopt() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΎΠΏΡΠΈΠΉ Π΄Π»Ρ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°:
#include <sys/socket.h>
int setsockopt(int sock, int level, int option,
const void * valptr, int vallength);
ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΡΠΎ ΡΠΎΠΊΠ΅Ρ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΎΠΏΡΠΈΡ. ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, level, ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΈΠΏ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΎΠΏΡΠΈΠΈ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ SOL_SOCKET, ΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΎΠΏΡΠΈΠΈ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ option ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠΏΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· valptr, Π° ΡΠ°Π·ΠΌΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ valptr, ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ vallength. ΠΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΎΠΏΡΠΈΡ SO_REUSEADDR.
17.5.8. ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ TCP
ΠΠ»ΠΈΠ΅Π½ΡΡ TCP ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π΄ΠΎΠΌΠ΅Π½Π° Unix. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅ΡΠ°, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ connect(). ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π°Π΄ΡΠ΅ΡΠ° Π² connect(). ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² TCP ΠΎΡΡΡΠΊΠΈΠ²Π°ΡΡ ΠΈΠΌΡ Ρ ΠΎΡΡΠ° ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ getaddrinfo(), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ connect().
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠΉ TCP-ΠΊΠ»ΠΈΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅. ΠΠ½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ: ΠΈΠΌΡ Ρ ΠΎΡΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ²Π΅Ρ, ΠΈΠ»ΠΈ Π΅Π³ΠΎ IP-Π½ΠΎΠΌΠ΅Ρ (Π² Π΄Π΅ΡΡΡΠΈΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠΎΡΠΊΠ°ΠΌΠΈ). ΠΠΎ Π²ΡΠ΅ΠΌ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠΎΠΊΠ΅ΡΠ° Π΄ΠΎΠΌΠ΅Π½Π° Unix, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅.
1: /* tclient.Ρ */
2:
3: /* ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ, ΡΡΠ΅ ΠΈΠΌΡ Ρ ΠΎΡΡΠ° ΠΈΠ»ΠΈ IP-Π°Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅
4: Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, Π½Π° ΠΏΠΎΡΡΠ΅ 4321. ΠΠΎΡΠ»Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅
5: stdin Π² ΡΠΎΠΊΠ΅Ρ, Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ. */
6:
7: #include <arpa/inet.h>
8: #include <netdb.h>
9: #include <netinet/in.h>
10: #include <stdio.h>
11: #include <stdlib.h>
12: #include <string.h>
13: #include <sys/socket.h>
14: #include <unistd.h>
15:
16: #include "sockutil.h" /* Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ */