Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СистПриклПрогЗабез(Хихловская).doc
Скачиваний:
25
Добавлен:
10.02.2016
Размер:
961.02 Кб
Скачать

Чтение длины записи

Длина записи считывается в переменную reclen. Функция readvrec возвращает 0(конец файла), если число байтов, прочитанных readn не точно совпадает с размером целого или –1 в случае ошибки.

Размер записи преобразуется из сетевого порядка в машинный.

Проверка того, поместится ли в буфер запись

Проверка того, поместится ли в буфер запись, достаточна ли длина буфера, предоставленного вызывающей программой, для размещения в ней записи. Если места недостаточно, то данные считываются в буфер частями по lenбайт, то есть по сути отбрасываются. Изъяв из потока отбрасываемые данные, функция присваивает переменнойerrnoзначениеEMSGSIZEи возвращает –1.

Считывание записи

Считывается сама запись, readvrecвозвращает –1,0 илиreclenв зависимости от того, вернула лиreadnкод ошибки, неполный счётчик или нормальное значение.

Функция strlen

Функция strlenвозвращает длину строкиsl(число символов в строкеslдо нулевого символа в строке, обозначающего её конец).

Функции ntohe и ntohs

Преобразуют целое число из сетевого порядка в машинный. В современных компьютерах целые числа хранятся по-разному в зависимости от архитектуры процессора.

Например, число $12345678 может храниться в памяти:

  1. big endian(Motorola)тупоконечные 12 34 56 78

  2. little endian(INTEL)остроконечные 78563412

Терминология введена Коэном в 1981г.

Определить формат, применяемый в конкретной машине, можно с помощью следующей программы:

  1. #include<stdio.n>

  2. #include<sys/types.n>

  3. #include”etcp.h”

  4. int main(void)

  5. {

  6. u_int32_t x=0x12345678;/*305419896*/

  7. unsigned char xp=(char)&x;

  8. printf(“%0x%0x%0x%0x)n”;

  9. xp[0],xp[1],xp[2],xp[3];

  10. exit(0);

  11. }

Формат хранения байтов важен, так как машины с разным принципом хранения часто общаются друг с другом по протоколам TCP/IP. Такая информация, как адреса отправления и назначения, номера портов, длина дейтограмм, размеры окон, представляются в виде целых чисел, необходимо их одинаково интерпретировать.

Чтобы обеспечить взаимодействие компьютеров с разными архитектурами, величины, относящиеся к протоколам, передаются в сетевом порядке, который по определению является тупоконечным. Сетевые адреса, номера портов, другие данные, представленные в заголовках, задаются программистом, и их нужно преобразовывать в сетевой порядок.

Функции htoneиhtonsвозвращают 32 и 16-разрядные числа в сетевом порядке. Функцииntoneиntonsвозвращают целое число в машинном порядке. На любой машине эти функции следует применять всегда, остальное делает система.

#include<netinet/in.h>

u

В сетевой

int32_t htone(uint32_t host32);

uint16_t htons(uint16_t host16);

u

В машинный

int32_t ntohe(uint32_tnetwork32);

uint16_t ntohs(uint16_t network16)

Функции разрешения имён

Gethostbynameиgetservbyname

Преобразование имён хостов

Эти функции возвращают значение, представленные в сетевом порядке. Фрагмент программы:

Struct servent*sp;

Struct sockaddr_in*sap;

Sp=getservbyname(name,protocol);

Sap->sin_port=htons(sp->ss_port);

Приведёт к ошибке, если исполняется не на тупоконечной машине.