Операционные системы. Учебное пособие. Марапулец Ю.В. - 193 стр.

UptoLike

Составители: 

Когда сервер получает запрос от клиента и принимает решение об установлении
связи, он создает новый узел и связывает его с ассоциацией, эквивалентной "узлу в ре-
жиме ожидания". Для Internet домена это означает тот же самый номер порта. Для этой
цели используется системный вызов accept:
newsock = accept(s, clientaddr, clientaddrlen);
Узел, ассоциированный клиентом, и узел, который был возвращен функцией
accept, используются для установления связи между сервером и клиентом.
Когда связь установлена, с помощью различных функций может начаться процесс
передачи данных. При наличии связи, пользователь может посылать и получать сообще-
ния с помощью функций read и write:
write(s, buf, sizeof(buf));
read(s, buf, sizeof(buf));
Вызовы send и recv практически идентичны read и write, за исключением того, что
добавляется аргумент флагов.
send(s, buf, sizeof(buf), flags);
recv(s, buf, sizeof(buf), flags);
Могут быть указаны один или более флагов с помощью ненулевых значений, таких, как
следующие:
MSG_OOB - Посылать/получать данные, характерные для гнезд типа stream.
MSG_PEEK - Просматривать данные без чтения. В этом случае данные посылаются
пользователю, но сами помечаются как "непрочитанные". Следующий read или recv
вызванный на данном узле вернет прочитанные в прошлый раз данные.
MSG_DONTROUTE - посылать данные без маршрутизации пакетов. (Используется
только процессами, управляющими таблицами маршрутизации.)
Закрытие узла производится следующим образом. Если узел больше не использу-
ется, процесс может закрыть его с помощью функции close, вызвав ее с соответствую-
щим дескриптором узла:
close(s);
Если данные были ассоциированы с узлом, обещающим доставку (тип stream), сис-
тема будет пытаться осуществить передачу этих данных. Тем не менее, по истечении
довольно длительного промежутка времени, если данные все еще не доставлены, они
будут отброшены. Если пользовательский процесс желает немедленно прекратить лю-
бую передачу данных, он может сделать это с помощью вызова shutdown на данном узле
для его закрытия. Формат вызова следующий [12]:
shutdown(s, how);
где how имеет одно из следующих значений:
0 - если пользователь больше не желает читать данные
1 - если данные больше не будут посылаться
2 - если данные не будут ни посылаться ни получаться
Функции преобразования данных. Другой набор функций интерфейса Winsock
связан с преобразованием данных из Сетевого формата в формат базового компьютера и
в обратном направлении (табл.8.2). Эти функции рекомендуется применять даже в том
195
     Когда сервер получает запрос от клиента и принимает решение об установлении
связи, он создает новый узел и связывает его с ассоциацией, эквивалентной "узлу в ре-
жиме ожидания". Для Internet домена это означает тот же самый номер порта. Для этой
цели используется системный вызов accept:

newsock = accept(s, clientaddr, clientaddrlen);

     Узел, ассоциированный клиентом, и узел, который был возвращен функцией
accept, используются для установления связи между сервером и клиентом.
     Когда связь установлена, с помощью различных функций может начаться процесс
передачи данных. При наличии связи, пользователь может посылать и получать сообще-
ния с помощью функций read и write:

write(s, buf, sizeof(buf));
read(s, buf, sizeof(buf));

     Вызовы send и recv практически идентичны read и write, за исключением того, что
добавляется аргумент флагов.

send(s, buf, sizeof(buf), flags);
recv(s, buf, sizeof(buf), flags);

Могут быть указаны один или более флагов с помощью ненулевых значений, таких, как
следующие:
• MSG_OOB - Посылать/получать данные, характерные для гнезд типа stream.
• MSG_PEEK - Просматривать данные без чтения. В этом случае данные посылаются
   пользователю, но сами помечаются как "непрочитанные". Следующий read или recv
   вызванный на данном узле вернет прочитанные в прошлый раз данные.
• MSG_DONTROUTE - посылать данные без маршрутизации пакетов. (Используется
   только процессами, управляющими таблицами маршрутизации.)
      Закрытие узла производится следующим образом. Если узел больше не использу-
ется, процесс может закрыть его с помощью функции close, вызвав ее с соответствую-
щим дескриптором узла:

close(s);

     Если данные были ассоциированы с узлом, обещающим доставку (тип stream), сис-
тема будет пытаться осуществить передачу этих данных. Тем не менее, по истечении
довольно длительного промежутка времени, если данные все еще не доставлены, они
будут отброшены. Если пользовательский процесс желает немедленно прекратить лю-
бую передачу данных, он может сделать это с помощью вызова shutdown на данном узле
для его закрытия. Формат вызова следующий [12]:

shutdown(s, how);
где how имеет одно из следующих значений:
• 0 - если пользователь больше не желает читать данные
• 1 - если данные больше не будут посылаться
• 2 - если данные не будут ни посылаться ни получаться
     Функции преобразования данных. Другой набор функций интерфейса Winsock
связан с преобразованием данных из Сетевого формата в формат базового компьютера и
в обратном направлении (табл.8.2). Эти функции рекомендуется применять даже в том


                                              195