Основы операционных систем. Практикум


         

Системные вызовы sendto() и recvfrom()


Для отправки датаграмм применяется системный вызов sendto(). В число параметров этого вызова входят:

  • дескриптор сокета, через который отсылается датаграмма;
  • адрес области памяти, где лежат данные, которые должны составить содержательную часть датаграммы, и их длина;
  • флаги, определяющие поведение системного вызова (в нашем случае они всегда будут иметь значение 0);
  • указатель на структуру, содержащую адрес сокета получателя, и ее фактическая длина.

Системный вызов возвращает отрицательное значение при возникновении ошибки и количество реально отосланных байт при нормальной работе. Нормальное завершение системного вызова не означает, что датаграмма уже покинула ваш компьютер! Датаграмма сначала помещается в системный сетевой буфер, а ее реальная отправка может произойти после возврата из системного вызова. Вызов sendto() может блокироваться, если в сетевом буфере не хватает места для датаграммы.

Для чтения принятых датаграмм и определения адреса получателя (при необходимости) служит системный вызов recvfrom(). В число параметров этого вызова входят:

  • Дескриптор сокета, через который принимается датаграмма.
  • Адрес области памяти, куда следует положить данные, составляющие содержательную часть датаграммы.
  • Максимальная длина, допустимая для датаграммы. Если количество данных датаграммы превышает заданную максимальную длину, то вызов по умолчанию рассматривает это как ошибочную ситуацию.
  • Флаги, определяющие поведение системного вызова (в нашем случае они будут полагаться равными 0).
  • Указатель на структуру, в которую при необходимости может быть занесен адрес сокета отправителя. Если этот адрес не требуется, то можно указать значение NULL.
  • Указатель на переменную, содержащую максимально возможную длину адреса отправителя. После возвращения из системного вызова в нее будет занесена фактическая длина структуры, содержащей адрес отправителя. Если предыдущий параметр имеет значение NULL, то и этот параметр может иметь значение NULL.

Системный вызов recvfrom() по умолчанию блокируется, если отсутствуют принятые датаграммы, до тех пор, пока датаграмма не появится.

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий