Π€ΡΠ½ΠΊΡΠΈΡ getsockopt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΡΠΎΠΌΠ΅ Π²ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΡΠ½ΠΊΡΠΈΡ getsockopt() ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
β¦ SO_ERROR β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ (Π±ΡΠ΄Π΅Ρ Π² Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ);
β¦ SO_TYPE β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΠΏ ΡΠΎΠΊΠ΅ΡΠ°.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΠΏΡΠΈΡΠΌΠΈ ΡΠΎΠΊΠ΅ΡΠΎΠ². ΠΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° TCP.
#include "sock.h"
#include "stdio.h"
main() {
int sd; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° */
int optval; /* Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ */
int optlen; /* Π΄Π»ΠΈΠ½Π° optval */
int new_buffsize = 8192; /* Π½ΠΎΠ²ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° */
/* ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ */
sd = socket(AF_INET, SOCK_STREAM, 0);
/* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ Π±ΡΡΠ΅ΡΠ° TCP */
optlen = sizeof(optval);
getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);
printf("Size of send buffer %d\n", optval);
getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
printf("Size of recv buffer %d\n", optval);
/* ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρ Π±ΡΡΠ΅ΡΠ° */
setsockopt(sd, SOL_SOCKET, SO_RCVBUF,
&new_buffsize, sizeof(new_buffsize));
setsockopt(sd, SOL_SOCKET, SO_SNDBUF,
&new_buffsize, sizeof(new_buffsize));
/* Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ */
getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);
printf("New size of send buffer %d\n", optval);
getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
printf("New size of recv buffer %d\n", optval);
}
27.3.10. Π‘ΠΈΠ³Π½Π°Π»Ρ ΠΈ ΡΠΎΠΊΠ΅ΡΡ
Π‘ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΡΠ²ΡΠ·Π°Π½Ρ ΡΡΠΈ ΡΠΈΠ³Π½Π°Π»Π°:
β¦ SIGIO β ΡΠΎΠΊΠ΅Ρ Π³ΠΎΡΠΎΠ² ΠΊ Π²Π²ΠΎΠ΄Ρ/Π²ΡΠ²ΠΎΠ΄Ρ. Π‘ΠΈΠ³Π½Π°Π» ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²ΡΠ·Π°Π½ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ;
β¦ SIGURG β ΡΠΎΠΊΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠΊΡΠΏΡΠ΅ΡΡ-Π΄Π°Π½Π½ΡΠ΅ (ΠΌΡ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΡΠΎΠ±ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° Π½ΠΈΡ Π½Π΅Ρ ΡΠΌΡΡΠ»Π°);
β¦ SIGPIPE β Π·Π°ΠΏΠΈΡΡ Π² ΡΠΎΠΊΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. Π‘ΠΈΠ³Π½Π°Π» ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΌΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ write() Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΈΠ³Π½Π°Π» SIGPIPE, Π΅ΡΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ ΠΈΠ»ΠΈ ΡΠ²ΡΠ·Ρ ΠΏΠΎ ΡΠ΅ΡΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°.
ΠΡΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° SIGPIPE ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅.
ΠΠΈΡΡΠΈΠ½Π³ 27.6. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° SIGPIPE
#include "sock.h"
#include <signal.h>
/* ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGPIPE */
sigpipe_handler() {
err_quit("ΠΠΎΠ»ΡΡΠ΅Π½ SIGPIPE \n");
}
main() {
int sock; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° */
/* ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° SIGPIPE */
signal(SIGPIPE, sigpipe_handler);
/* ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ */
}
27.3.11. ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ΅ΠΉ Π·Π°ΠΏΡΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π²ΡΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅: ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². ΠΠ»Ρ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² select(). ΠΡΠΎΡ Π²ΡΠ·ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΏΠ΅ΡΡΠ΅ΡΠ²Π΅Ρ xinetd.
ΠΠΈΡΡΠΈΠ½Π³ 27.7. ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ²
#include "sock.h"
#include <sys/time.h>
main() {
int sock; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° */
int new_sock; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ accept */
int retval; /* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ */
struct sockaddr_in server; /* Π°Π΄ΡΠ΅Ρ ΡΠΎΠΊΠ΅ΡΠ° */
fd_set readv; /* ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ select */
fd_set writev; /* ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ select */
struct timeval tout; /* ΡΠ°ΠΉΠΌ-Π°ΡΡ Π΄Π»Ρ select */
/* Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ» ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ */
for (;;) {
/* ΠΏΡΠΎΡΠ΅ΡΡ ΠΆΠ΄Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅;
ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΄Π°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ */
FD_ZERO(&readv);
FD_ZERO(&writev);
FD_SET(sock, &readv);
FD_SET(sock, &writev);
tout.tv_sec = 10; /* 10 ΡΠ΅ΠΊΡΠ½Π΄ */
retval = select(sock+1, &readv, &writev, 0, &to);
/* Π΅ΡΠ»ΠΈ select Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π·Π½Π°ΡΠΈΡ ΡΠ°ΠΉΠΌ-Π°ΡΡ */
if (retval == 0) {
err_ret("timeout");
continue;
}
/* Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΈΡΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ */
if ( (FD_ISSET(sock, &readv)) || (FD_ISSET(sock, &writev))) {
/* ΠΏΡΠΈΠ΅ΠΌ ΡΠ²ΡΠ·ΠΈ Ρ ΡΠΎΠΊΠ΅ΡΠ° */
new_sock = accept(sock, (struct sockaddr *)0, (int *)0);
/* ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ new_sock */
...
/* Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ²ΡΠ·ΠΈ */
close(new_sock);
} else {
err_ret("ΠΡΠΎ Π½Π΅ ΡΠΎΠΊΠ΅Ρ! ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ Π²ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ\n");
}
}
}
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² select() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ 5 Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²:
int select(int fd, fd_set *input, fd_set *output,
fd_set *error, struct timeval *timeout);
ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, fd, β ΡΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠΌ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π·Π°Π΄Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π²Π²ΠΎΠ΄Π° (input), Π²ΡΠ²ΠΎΠ΄Π° (output) ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ (error). ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΡΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡ.
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ΅Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²:
FD_ZERO(fd_set);
FD_SET(fd, fd_set);
FD_CLR(fd, fd_set);
ΠΠ΅ΡΠ²ΡΠΉ ΠΌΠ°ΠΊΡΠΎΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΈΡΠ°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²Π° ΠΌΠ°ΠΊΡΠΎΡΠ°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΄Π²Π° ΠΌΠ°ΠΊΡΠΎΡΠ° Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΈ Π΄Π²Π° Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π°. Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΈΡΡΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, Π° ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² Π½Π΅Π³ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ:
FD_ZERO(&readv);
FD_ZERO(&writev);
FD_SET(sock, &readv);
FD_SET(sock, &writev);
ΠΡΠΎΠ±ΠΎΠ³ΠΎ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ° ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΠ°ΠΉΠΌ-Π°ΡΡ. Π’Π°ΠΉΠΌ-Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ΠΈ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΠ°ΠΉΠΌ-Π°ΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΈ 5 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄:
struct timeval tout; /* ΡΠ°ΠΉΠΌ-Π°ΡΡ Π΄Π»Ρ select */
tout.tv_sec = 2; /* 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ */
tout.tv_usec = 5; /* 5 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ */
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠΌ-Π°ΡΡ (ΡΠΎ Π΅ΡΡΡ ΠΆΠ΄Π°ΡΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ), ΡΠΊΠ°ΠΆΠΈΡΠ΅ NULL Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ select() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΠΈΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ (Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄/ΠΎΡΠΈΠ±ΠΊΠ°) ΠΈΠ»ΠΈ -1 ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅.
ΠΠΎΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ select(). ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π²Π²ΠΎΠ΄Π° ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΈ ΠΈΠ· ΡΠΎΠΊΠ΅ΡΠ°. ΠΡΠ»ΠΈ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡ ΡΠ°ΠΉΠΌ-Π°ΡΡ Π² 20 ΡΠ΅ΠΊΡΠ½Π΄, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²ΠΈΠ΄ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ ΡΠ²ΠΈΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: Β«ΠΠΎΠ»ΡΡΠ΅Π½ Π²Π²ΠΎΠ΄ ΠΈΠ· ΡΠ°ΠΉΠ»Π°/ΡΠΎΠΊΠ΅ΡΠ°Β».
ΠΠΈΡΡΠΈΠ½Π³ 27.8. ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ select()
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/select.h>
int k;
int sock;
int fd;
int max_fd;
fd_set input;
struct timeval timeout;
/* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΈ ΡΠΎΠΊΠ΅ΡΠ° */
...
/* ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π²ΠΎΠ΄Π° */
FD_ZERO(input);
FD_SET(fd, input);
FD_SET(sock, input);
max_fd = (sock > fd ? sock : fd) + 1;
/* ΠΠ°Π΄Π°Π΅ΠΌ ΡΠ°ΠΉΠΌ-Π°ΡΡ */
timeout.tv_sec = 20;
k = select(max_fd, &input, NULL, NULL, &timeout);
if (k < 0)
perror("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ select");
else if (k == 0) puts("TIMEOUT");
else {
/* ΠΠΎΠ»ΡΡΠ΅Π½ Π²Π²ΠΎΠ΄ */
if (FD_ISSET(fd, input))
printf("ΠΠΎΠ»ΡΡΠ΅Π½ Π²Π²ΠΎΠ΄ ΠΈΠ· ΡΠ°ΠΉΠ»Π°");
if (FD_ISSET(sock, input))
printf("ΠΠΎΠ»ΡΡΠ΅Π½ Π²Π²ΠΎΠ΄ ΠΈΠ· ΡΠΎΠΊΠ΅ΡΠ°");
}
ΠΡΠΎΠ΄Π΅ Π±Ρ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡ, Π½ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠ°ΠΊΡΠΎΡ FD_ISSET. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π΅ΡΡΡ Π»ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ Π²Π²ΠΎΠ΄Π° Π²Π²ΠΎΠ΄ ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°.
27.3.12. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΠ» ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ. ΠΡΠΈΠΌΠ΅ΡΡ ΡΠ°ΠΊΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ:
β¦ accept();
β¦ connect();
β¦ read();
β¦ write().
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΡΠ΅Π½Ρ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π°Π½ΡΡΡΡΡ ΡΠ΅ΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΈΠΌ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΡΡ Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠΎΠΊΠ΅ΡΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Ρ ioctl().
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅:
β¦ ΡΡΠ½ΠΊΡΠΈΡ accept() ΡΡΠ°Π·Ρ ΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ EWOULDBLOCK;
β¦ ΡΡΠ½ΠΊΡΠΈΡ connect() ΡΠΎΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, Π½ΠΎ Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ: EINPROGRESS;
β¦ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ (read(), recv(), recvfrom()) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ -1 ΠΈΠ»ΠΈ 0, Π΅ΡΠ»ΠΈ Π½Π΅Ρ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ .
Π―ΡΠ½ΠΎΠ΅ Π΄Π΅Π»ΠΎ, ΡΡΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄Π°Π½Π½ΡΡ β Π²Π΅Π΄Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ: Π΅ΡΠ»ΠΈ ΠΈΡ Π½Π΅Ρ, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΡΡ -1 ΠΈΠ»ΠΈ 0.
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅:
ΠΠΈΡΡΠΈΠ½Π³ 27.9. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ioctl()
#include "sock.h"
#include <sys/ioctl.h>
void main() {
int sock;
int on = 1, off = 0; /* Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π½Ρ ioctl() */
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ */