Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 3.8 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΡΠ°ΡΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ AF_INET.
ΠΠΈΡΡΠΈΠ½Π³ 3.8. ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ sock_ntop
//lib/sock_ntop.c
5 char *
6 sock_ntop(const struct sockaddr *sa, socklen_t salen)
7 {
8 char portstr[7];
9 static char str[128]; /* ΠΌΠ°ΠΊΡ. Π΄Π»ΠΈΠ½Π° Π΄Π»Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Unix */
10 switch (sa->sa_family) {
11 case AF_INET: {
12 struct sockaddr_in *sin = (struct sockaddr_in*)sa;
13 if (inet_ntop(AF_INET, &sin->sin_addr. str, sizeof(str)) == NULL)
14 return (NULL);
15 if (ntohs(sin->sin_port) != 0) {
16 snprintf(portstr, sizeof(portstr), ntohs(sin->sin_port));
17 strcat(str, portstr);
18 }
19 return (str);
20 }
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ² ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΏΡΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρ IPv4 ΠΈ IPv6.
#include "unp.h"
int sock_bind_wild(int sockfd, int family);
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ: 0 Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, -1 Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ
int sock_cmp_addr(const struct sockaddr *sockaddr1,
const struct sockaddr *sockaddr2, socklen_t addrlen);
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ: 0, Π΅ΡΠ»ΠΈ Π°Π΄ΡΠ΅ΡΠ° ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Ρ ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
int sock_cmp_port(const struct sockaddr *sockaddr1,
const struct sockaddr *sockaddr2, socklen_t addrlen);
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ: 0, Π΅ΡΠ»ΠΈ Π°Π΄ΡΠ΅ΡΠ° ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Ρ ΠΈ ΠΏΠΎΡΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
int sock_get_port(const struct sockaddr *sockaddr, socklen_t addrlen);
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ: Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Π΄Π»Ρ Π°Π΄ΡΠ΅ΡΠΎΠ² IPv4 ΠΈΠ»ΠΈ IPv6, ΠΈΠ½Π°ΡΠ΅ -1
char *sock_ntop_host(const struct sockaddr *sockaddr, socklen_t addrlen);
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ: Π½Π΅ΠΏΡΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, NULL Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ
void sock_set_addr(const struct sockaddr *sockaddr,
socklen_t addrlen, void *ptr);
void sock_set_port(const struct sockaddr *sockaddr,
socklen_t addrlen, int port);
void sock_set_wild(struct sockaddr *sockaddr, socklen_t addrlen);
Π€ΡΠ½ΠΊΡΠΈΡ sock_bind_wild ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌΡΠΉ ΠΏΠΎΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ. Π€ΡΠ½ΠΊΡΠΈΡ sock_cmp_addr ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π°Π΄ΡΠ΅ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ Π΄Π²ΡΡ ΡΡΡΡΠΊΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ°, Π° ΡΡΠ½ΠΊΡΠΈΡ sock_cmp_port ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π½ΠΎΠΌΠ΅ΡΠ° ΠΈΡ ΠΏΠΎΡΡΠΎΠ². Π€ΡΠ½ΠΊΡΠΈΡ sock_get_port Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ°, Π° ΡΡΠ½ΠΊΡΠΈΡ sock_ntop_host ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΊ ΡΠΎΡΠΌΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡ ΡΠ°ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΠ·Π»Ρ (Π²ΡΠ΅, ΠΊΡΠΎΠΌΠ΅ ΠΏΠΎΡΡΠ°, ΡΠΎ Π΅ΡΡΡ IP-Π°Π΄ΡΠ΅Ρ ΡΠ·Π»Π°). Π€ΡΠ½ΠΊΡΠΈΡ sock_set_addr ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ptr, Π° ΡΡΠ½ΠΊΡΠΈΡ sock_set_port Π·Π°Π΄Π°Π΅Ρ Π² ΡΡΡΡΠΊΡΡΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ sock_set_wild Π·Π°Π΄Π°Π΅Ρ Π°Π΄ΡΠ΅ΡΠ½ΡΡ ΡΠ°ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ. ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, ΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ- ΠΎΠ±Π΅ΡΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΎΡ ΡΠΈΠΏΠ° void, ΠΈ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΠΎΠ±ΡΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±Π΅ΡΡΠΊΠΈ. ΠΡ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½ (ΡΠΌ. ΠΏΡΠ΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅).
3.9. Π€ΡΠ½ΠΊΡΠΈΠΈ readn, writen ΠΈ readline
ΠΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΊΠ΅ΡΡ TCP) Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ read ΠΈ write ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΠ°ΠΉΠ»ΠΎΠ². Π€ΡΠ½ΠΊΡΠΈΡ read ΠΈΠ»ΠΈ write Π½Π° ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΌ ΡΠΎΠΊΠ΅ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²Π²Π΅ΡΡΠΈ ΠΈΠ»ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ Π±Π°ΠΉΡΠΎΠ², ΡΠ΅ΠΌ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π»ΠΎΡΡ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠ΅ Π³ΡΠ°Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠΎΠΊΠ΅ΡΠ° Π² ΡΠ΄ΡΠ΅. ΠΡΠ΅, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π² ΡΡΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ β ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ²ΡΠΎΡΠΈΠ» Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ read ΠΈΠ»ΠΈ write Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π²ΡΠ²ΠΎΠ΄Π° ΠΎΡΡΠ°Π²ΡΠΈΡ ΡΡ Π±Π°ΠΉΡΠΎΠ². (ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Unix Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΊΠ°Π½Π°Π» (pipe) Π±ΠΎΠ»Π΅Π΅ 4096 Π±Π°ΠΉΡ.) ΠΡΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π½Π° ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΌ ΡΠΎΠΊΠ΅ΡΠ΅ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ read, Π½ΠΎ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ write ΠΎΠ½ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΠΎΠΊΠ΅Ρ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²ΠΌΠ΅ΡΡΠΎ write ΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ writen Π½Π° ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΡΡ , ΡΠ΅ΠΌ ΠΌΡ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ.
ΠΠ²Π΅Π΄Π΅ΠΌ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ ΡΠΎΠΊΠ΅Ρ.
#include "unp.h"
ssize_t readn(int filedes, void *buff, size_t nbytes);
ssize_t writen(int filedes, const void *buff, size_t nbytes);
ssize_t readline(int filedes, void *buff, size_t maxlen);
ΠΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠΈΡΠ°Π½Π½ΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π±Π°ΠΉΡΠΎΠ², -1 Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 3.9 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ readn, Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 3.10 β ΡΡΠ½ΠΊΡΠΈΡ writen, Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 3.11 β ΡΡΠ½ΠΊΡΠΈΡ readline.
ΠΠΈΡΡΠΈΠ½Π³ 3.9. Π€ΡΠ½ΠΊΡΠΈΡ readn: ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ n Π±Π°ΠΉΡ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°
//lib/readn.c
1 #include "unp.h"
2 ssize_t /* Π‘ΡΠΈΡΡΠ²Π°Π΅Ρ n Π±Π°ΠΉΡ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° */
3 readn(int fd, void *vptr, size_t n)
4 {
5 size_t nleft;
6 ssize_t nread;
7 char *ptr;
8 ptr = vptr;
9 nleft = n;
10 while (nleft > 0) {
11 if ((nread = read(fd, ptr, nleft)) < 0) {
12 if (errno == EINTR)
13 nread = 0; /* ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠ½ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ read() */
14 else
15 return (-1);
16 } else if (nread == 0)
17 break; /* EOF */
18 nleft -= nread;
19 ptr += nread;
20 }
21 return (n - nleft); /* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ >= 0 */
22 }
ΠΠΈΡΡΠΈΠ½Π³ 3.10. Π€ΡΠ½ΠΊΡΠΈΡ writen: Π·Π°ΠΏΠΈΡΡ n Π±Π°ΠΉΡ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ
//lib/writen.c
1 #include "unp.h"
2 ssize_t /* ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ n Π±Π°ΠΉΡ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ */
3 writen(int fd, const void *vptr, size_t n)
4 {
5 size_t nleft;
6 ssize_t nwritten;
7 const char *ptr;
8 ptr = vptr;
9 nleft = n;
10 while (nleft > 0) {
11 if ((nwritten = write(fd, ptr, nleft)) <= 0) {
12 if (errno == EINTR)
13 nwritten = 0; /* ΠΈ ΡΠ½ΠΎΠ²Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ write() */
14 else
15 return (-1); /* ΠΎΡΠΈΠ±ΠΊΠ° */
16 }
17 nleft -= nwritten;
18 ptr += nwritten;
19 }
20 return (n);
21 }
ΠΠΈΡΡΠΈΠ½Π³ 3.11. Π€ΡΠ½ΠΊΡΠΈΡ readline: ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π±Π°ΠΉΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·
//test/readline1.Ρ
1 #include "unp.h"
/* Π£ΠΆΠ°ΡΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° */
2 ssize_t
3 readline(int fd, void *vptr, size_t maxlen)
4 {
5 ssize_t n, rc;
6 char c, *ptr;
7 ptr = vptr;
8 for (n = 1; n < maxlen; n++) {
9 again:
10 if ((rc = read(fd, &c, 1)) == 1) {
11 *ptr++ = c;
12 if (c == '\n')
13 break; /* Π·Π°ΠΏΠΈΡΠ°Π½ ΡΠΈΠΌΠ²ΠΎΠ» Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠ°ΠΊ Π² fgets() */
14 } else if (rc == 0) {
15 if (n == 1)
16 return (0); /* EOF, Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΡΡΠΈΡΠ°Π½Ρ */
17 else
18 break; /* EOF, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ»ΠΈ ΡΡΠΈΡΠ°Π½Ρ */
19 } else {
20 if (errno == EINTR)
21 goto again;
22 return (-1); /* ΠΎΡΠΈΠ±ΠΊΠ°, errno Π·Π°Π΄Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ read() */
23 }
24 }
25 *ptr = 0; /* Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ Π½ΡΠ»Π΅ΠΌ, ΠΊΠ°ΠΊ Π² fgets() */
26 return (n);
27 }
ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ (read ΠΈΠ»ΠΈ write) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ, ΡΠΎ Π½Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Π»ΠΈ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ Ρ EINTR (ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ, ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 5.9). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅ΡΠ²Π°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. ΠΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ Π² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°ΡΡΠ°Π²Π»ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ½ΠΎΠ²Π° Π²ΡΠ·Π²Π°ΡΡ read ΠΈΠ»ΠΈ write, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π»ΡΡ Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π΅Ρ Π²Π°ΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ.
Π ΡΠ°Π·Π΄Π΅Π»Π΅ 14.3 ΠΌΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΡΡΠΎ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ recv Ρ ΡΠ»Π°Π³ΠΎΠΌ MSG_WAITALL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ readn.
ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ readline Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ read ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΡΠΎ ΠΎΡΠ΅Π½Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΈ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠΈ Β«Π£ΠΆΠ°ΡΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ!Β». ΠΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ±Π»Π°Π·Π½ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° (stdio). ΠΠ± ΡΡΠΎΠΌ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 14.8, Π½ΠΎ ΡΡΡΠΈΡΠ΅, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ. ΠΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠ°Ρ stdio, ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π»ΠΎΠ³ΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ ΡΠΊΡΡΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠΎΠ² stdio Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠΎΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΏΡΠΈΡΠ΅ΠΌ ΡΠ°ΠΊΠΎΠΉ, ΡΡΠΎ ΠΌΠΎΠ³ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² (Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΈΠΏΠΈΡΠ½ΠΎΠ΅ ΡΠ²Π»Π΅Π½ΠΈΠ΅; Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π΅Π±-Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠ² ΠΈ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π±ΡΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ HTTP). Π₯ΠΎΡΠΎΡΠΈΠΉ ΡΡΠΈΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΎΡ ΡΠ²ΠΎΠΈΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄Π½ΠΈΠΊΠΎΠ² ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, Π½ΠΎ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΠΊ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ°. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΠΈΠΌΠ΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΠΈ ΡΡΡΡΠ°Π½ΡΡΡ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ Π²Π·Π»ΠΎΠΌΠ° ΡΠΈΡΡΠ΅ΠΌ. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π°Π²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ stdio ΠΌΠ΅ΡΠ°Π΅Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΡΡ (Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ) Π΄Π°Π½Π½ΡΡ Π² Π±ΡΡΠ΅ΡΠ°Ρ stdio Π² Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.