Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 131

Автор Уильям БтивСнс

 9   err_quit("usage: tcpcli <IPaddress>");

10  sockfd = Socket(AF_INET, SOCK_STREAM, 0);


11  bzero(&servaddr, sizeof(servaddr));

12  servaddr.sin_family = AF_INET;

13  servaddr.sin_port = htons(SERV_PORT);

14  Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);


15  Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));


16  ling.l_onoff = 1; /* для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сСгмСнта RST ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ соСдинСния */

17  ling.l_linger = 0;

18  Setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));

19  Close(sockfd);


20  exit(0);

21 }

Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта SO_LINGER

16-19 ΠšΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ соСдинСниС устанавливаСтся, ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_LINGER, устанавливая Ρ„Π»Π°Π³ l_onoff Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ обнуляя врСмя l_linger. Как ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π»ΠΎΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.5, это Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ RST Π½Π° сокСтС TCP ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ соСдинСния. Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ close ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сокСт.

ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ измСняСм наш сСрвСр TCP, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингах 6.3 ΠΈ 6.4, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС сообщСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select ΠΎ готовности ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ сокСта для чтСния, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept наступала ΠΏΠ°ΡƒΠ·Π°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅, взятом ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° листинга 6.4, Π΄Π²Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ строки ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π·Π½Π°ΠΊΠΎΠΌ +.

  if (FD_ISSET(listenfd, &rset)) { /* Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС */

+  printf("listening socket readable\n");

+  sleep(5);

   clilen = sizeof(cliaddr);

   connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ занятый сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept сразу ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функция select сообщит, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт Π³ΠΎΡ‚ΠΎΠ² для чтСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ со стороны сСрвСра Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ для этих ситуаций прСдусмотрСна ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ установлСнных соСдинСний). Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послС установлСния соСдинСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ±Ρ‹Π» сСгмСнт RST, Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.11 ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ сСрвСр Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept, Π² Π‘Π΅Ρ€ΠΊΠ»ΠΈ-рСализациях ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½ΠΎΠ΅ соСдинСниС Π½Π΅ возвращаСтся сСрвСру, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ECONNABORTED, Π½ΠΎ часто вмСсто Π½Π΅Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EPROTO. Рассмотрим Π‘Π΅Ρ€ΠΊΠ»ΠΈ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

β–  ΠšΠ»ΠΈΠ΅Π½Ρ‚ устанавливаСт соСдинСниС ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 16.14.

β–  Π€ΡƒΠ½ΠΊΡ†ΠΈΡ select сообщаСт процСссу сСрвСра, Ρ‡Ρ‚ΠΎ дСскриптор Π³ΠΎΡ‚ΠΎΠ² для чтСния, Π½ΠΎ Ρƒ сСрвСра Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, хотя ΠΈ Π½Π΅ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, врСмя.

β–  ΠŸΠΎΡΠ»Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ сСрвСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сообщСниС ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция accept, ΠΏΡ€ΠΈΠ±Ρ‹Π» сСгмСнт RST ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

β–  Π£ΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ соСдинСниС удаляСтся ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΈ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ сущСствуСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… установлСнных соСдинСний.

β–  Π‘Π΅Ρ€Π²Π΅Ρ€ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ установлСнных соСдинСний Π½Π΅Ρ‚, ΠΎΠ½ оказываСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½.

Π‘Π΅Ρ€Π²Π΅Ρ€ останСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ установит с Π½ΠΈΠΌ соСдинСниС. Но Ссли сСрвСр Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² листингС 6.4, Π² это врСмя ΠΎΠ½ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ дСскрипторы.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π°Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏΠ° Β«ΠΎΡ‚ΠΊΠ°Π· Π² обслуТивании», описанной Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 6.8. Однако Π² Π΄Π°Π½Π½ΠΎΠΌ случаС сСрвСр Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· состояния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ установит соСдинСниС.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π΄Π²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»Π°:

1. Π’сСгда Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ, Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, Π³ΠΎΡ‚ΠΎΠ²ΠΎ Π»ΠΈ соСдинСниС ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ accept.

2. Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ошибки, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept: EWOULDBLOCK (для Π‘Π΅Ρ€ΠΊΠ»ΠΈ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС), ECONNABORTED (для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ POSIX, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС), EPROTO (для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ SVR4, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС) ΠΈ EINTR (Ссли ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ сигналы).

16.7. РСзюмС

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ чтСния ΠΈ записи Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 16.2 использовался наш ΠΊΠ»ΠΈΠ΅Π½Ρ‚ str_cli, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ для примСнСния Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° соСдинСнии TCP с сСрвСром. Ѐункция select ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ-Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° дСскриптор станСт Π³ΠΎΡ‚ΠΎΠ² для чтСния ΠΈΠ»ΠΈ записи. Π­Ρ‚Π° вСрсия нашСго ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° являСтся самой Π±Ρ‹ΡΡ‚Ρ€ΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ· всСх ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… вСрсиСй, хотя Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ измСнСния ΠΊΠΎΠ΄Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ процСсс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° Π΄Π²Π΅ части ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ ΠΏΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² листингС 26.1.

НСблокируСмая функция connect позволяСт Π½Π°ΠΌ Π²ΠΎ врСмя трСхэтапного рукопоТатия TCP Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ вмСсто блокирования Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect. К соТалСнию, с этими функциями Ρ‚Π°ΠΊΠΆΠ΅ связана ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° совмСстимости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π»ΠΈ установлСно соСдинСниС ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка. ΠœΡ‹ использовали Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ соСдинСния для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ мноТСство соСдинСний TCP для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΡ‚ сСрвСра. ПодобноС ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ мноТСства соСдинСний ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ являСтся «нСдруТСствСнным ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ сСти», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ позволяСт Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ TCP, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ для прСдотвращСния ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ (congestion avoidance).

УпраТнСния

1. ΠžΠ±ΡΡƒΠΆΠ΄Π°Ρ листинг 16.6, ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ shutdown, Π° Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ close. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

2. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² листингС 16.6, Ссли процСсс сСрвСра Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ Π½Π΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ ΠΎΠ± этом Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс?

3. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² листингС 16.6, Ссли Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса, ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π·Π°Ρ‚Π΅ΠΌ считаСт ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° Π½Π° сокСтС?

4. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² листингС 16.7, Ссли ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки:

if (n == 0)

 goto done; /* функция connect Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ */

5. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 16.3 ΠΌΡ‹ сказали, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ситуация, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ для сокСта ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ функция connect. Когда это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ?

Π“Π»Π°Π²Π° 17

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl

17.1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Ѐункция ioctl Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ являлась систСмным интСрфСйсом, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ для всСго, Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΠ»ΠΎ Π² ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ. POSIX постСпСнно избавляСтся ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl, создавая Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ ΠΈ стандартизуя ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. НапримСр, доступ ΠΊ интСрфСйсу Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Unix Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ осущСствлялся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl, Π½ΠΎ Π² POSIX Π±Ρ‹Π»ΠΈ созданы 12 Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ²: tcgetattr для получСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, tcflush для ΠΎΠΏΡƒΡΡ‚ΠΎΡˆΠ΅Π½ΠΈΡ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈ Ρ‚.Π΄. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ POSIX замСняСт ΠΎΠ΄Π½Ρƒ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ioctl: новая функция sockatmark (см. Ρ€Π°Π·Π΄Π΅Π» 24.3) замСняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ SIOCATMARK ioctl. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ сСтСвыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ioctl ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ стандартизованными ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± интСрфСйсС ΠΈ обращСния ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΡΡˆΡƒ ARP (Address Resolution Protocol β€” ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ адрСсов).

Π’ этой Π³Π»Π°Π²Π΅ прСдставлСн ΠΎΠ±Π·ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ сСтСвому ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависят ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ систСмы, происходящиС ΠΎΡ‚ 4.4BSD ΠΈ Solaris 2.6, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сокСты Π΄ΠΎΠΌΠ΅Π½Π° AF_ROUTE (ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ сокСты) для выполнСния ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΈΠ· этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ сокСты ΠΌΡ‹ рассматриваСм Π² Π³Π»Π°Π²Π΅ 18.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ сСтСвыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, сСрвСры) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ioctl для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ±ΠΎ всСх интСрфСйсах ΡƒΠ·Π»Π° ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ адрСс интСрфСйса, Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ интСрфСйс ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ, ΠΌΠ½ΠΎΠ³ΠΎΠ°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΈ Ρ‚.Π΄. Для возвращСния этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π½Π°ΡˆΡƒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ прСдставляСм Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl, Π° Π² Π³Π»Π°Π²Π΅ 18 β€” Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ сокСты.

17.2. Ѐункция ioctl

Π­Ρ‚Π° функция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ, дСскриптор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСдаСтся Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ fd.

#include <unistd.h>


int ioctl(int fd, int request, ... /* void *arg */ );

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚: 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния, -1 Π² случаС ошибки

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ всСгда являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π½ΠΎ Ρ‚ΠΈΠΏ указатСля зависит ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° request.