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




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


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

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

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

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

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

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


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