- •Державний комітет зв’язку та інформатизації України
- •Современные проблемы информационных сетей
- •Инструменты и ресурсы
- •Формат пакета ping.
- •Программа tracert в Windows.
- •Порядок вызова
- •Программа tcpdump (снифер) сетевой анализатор для поиска неисправностией в сети и отладки сетевых приложений.
- •Использование tcpdump
- •Выходная информация, формируемая tcpdump
- •Программа netstat
- •4. Интерфейсы
- •Маршрутная таблица
- •Статистика протоколов
- •Процессы
- •Типы процессов
- •Прикладные процессы
- •Атрибуты процессов
- •Реальный (rgid) и эффективный (egid) идентификаторы группы
- •Жизненный путь процесса
- •Сигналы
- •Взаимодействие между процессами
- •Организация каналов
- •Взаимодействие между процессами
- •Размер канала
- •Функции к разделу fifo
- •Пример приложения клиент-сервер, использующего fifo для обмена данными. Клиент посылает серверу сообщенияHello, а сервер выводит это сообщение на терминал.
- •Права доступа к объекту
- •Идентификаторы и имена в ipc
- •Tcp как потоковый протокол
- •Чтение длины записи
- •Функции разрешения имён
- •Преобразование имён хостов
- •Аккуратное размыкание соединение
- •Вызов shutdown
- •Алгоритм Найгла
- •Программная реализация архитектуры клиент – сервер
- •1.2 Разработка программ в архитектуре “клиент-сервер”
- •Заполнение адресной структуры и получение сокета
- •Привязка известного порта и вывод listen
- •Принятие соединения.
- •Обмен данными
- •Программный интерфейс сокетов
- •Сокеты во FreeBsd
- •Типы соединения
- •Адресация
- •Адресация Internet
- •Interface сокетов
- •Создание сокета
- •Програмныйинтерфейс сокетов
- •Поддержка различных типов сокетов в доменах
- •Пример использования сокетов
- •Sdl-описание протокола сеансового уровня эталонной модели взаимосвязи открытых систем
- •Основные понятия
- •Описание служб
- •Описание протоколов
- •Службы ядра сеансового уровня
- •Блок данных протокола
- •Ясо-описание протокола сеансового уровня
- •Разбиение блока сеансового протокола
- •Описание блока блк-дир
- •Описание блока блк-исп
- •Описание процессов дир и рдт
- •Описание процесса исп
Tcp как потоковый протокол
Данные доставляются получателю в виде потока, в котором нет понятия сообщения или границы сообщения. В этом отношении чтение данных похоже на чтение из последовательного порта - заранее неизвестно, сколько байтов будет возвращено после выполнения функции чтения. Для TCP–приложения нет понятия «пакет», и хотя данные передаются вIP-пакетах, размер пакета не связан напрямую с количеством данных, переданныхTCPпри вызовеsend. У принимающего приложения нет надёжного способа определения, как именно данные распределены по пакетам, так как между соседними вызовамиrecvможет прийти несколько пакетов. Если один пакет потерян, а последующие пришли нормально,TCP“задерживает поступившие данные”, пока не будет повторно передан и корректно принят пропавший пакет.TCPследит за количеством байтов, посланных и подтвержденных, но не за их распределением по пакетам. Если пользоваться для чтения данных стандартной библиотечной функциейfgets, то она сама будет разбивать поток байтов на строки. Самый простой случай-это сообщение фиксированной длины. Тогда нужно прочесть заранее известное число байтов из потока. Для этого недостаточно выполнить простое однократное чтение:
Recv(s,msg,sizeof(msg),o);
Так как при этом можно получить меньше, чем sizeof(msg) байт
Функция readn
in readn(SOCKET fd,char*bp,size_t len)
{
int ent;
int rc;
ent=len;
while(ent>0)
{
rc=recv(fd,bp,ent,0);
if(rc<0) /’’ошибка чтения?*/
{
if(errno==ENTER)/*Вызов прерван?*/
continue;/*повторить чтение*/
return-1/*вернуть код ошибки*/
}
if(rc==0)/*конец файла*?/
returnlen-ent/*вернуть неполный счётчик*/
bp+=rc
ent-=rc;
}
return len;
}
Функция readnне возвращает управление, пока не будет прочитаноlenбайт или не получен конец файла, или не возникнет ошибка. Её прототип выглядит следующим образом :
# include <etcp.h>
int readn(SOCKET s,char*buf,size_tlen);
возвращаемое значение - число прочитанных байтов или –1 в случае ошибки.
Оператор if
If (errno==ENTER)
Continue;
(Errno-глобальная переменная ,ENTER -прерванный вызов функции) возобновляет выполнение вызова recv, если он прерван сигналом.
В случае сообщений переменной длины есть два метода разделения записей:
с помощью специальных маркеров с использованием fgetsдля разбиения потока на строки, например, с помощью разделителя-символа новой строки/. Тогда, если оно применяется в теле, то нужно здесь заменить его на //. На приёмной стороне происходит обратный процесс.
Каждое сообщение снабжается заголовком, содержащим, как минимум длину следующего за ним тела.
-
ДЛИНА ЗАПИСИ
ДРУГИЕ ДАННЫЕ ЗАГОЛОВКА
ДАННЫЕ ПЕРЕМЕННОЙ ДЛИНЫ
В процедуре fgetsпроисходит считывание символов из потока в буфер пока не встретится символ/.
Принимающее приложение читает сообщение в два приёма: заголовок фиксированной длины и из него извлекается переменная длина тела сообщения, а затем самое тело.
intreadvrec(SOCKETfd,char*bp,size_tlen),гдеSOCKET-тип данных,t-длина буфера.
{
uint32_t reclen;
Int rc;
/*прочитать длину записи*/
rc=readn(fd,(char*)&reclen ,size of(u_int32_t));
if(rc!=sizeof(u_int32_t))
return rc<0?-1:0;
reclen=ntohl(reclen);/*сетевой в машинный*/
if(reclen>len)
{
/*
*Не хватает места в буфере для размещения
*данных – отбросить их и вернуть код ошибки
*/
while(reclen>0)
{
rc=readn(fd,bp,len);
if(rc!=len)
returnrc<0?-1:0;
reclen==len;/*reclen=reclen-len*/
if(reclen<len)
len=reclen;
}
set_errno(EMSGSIZE);
return-1;
}
/*прочитать саму запись*/
rc=readn(fd,bp,reclen);
if(rc!=reclen)
return rc<0?-1:0;
return rc;
}