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

Опубликовано в Технологии > Серверные технологии

Проиллюстрируем описанные выше понятия на примере клиентской программы, в которой обеспечивается параллельная организация работы с использованием одного потока. В приведенном ниже примере параллельной клиентской программы, которая находится в файле TCPtecho.c, для одновременного выполнения нескольких измерений пропускной способности сети используется служба ECHO (см. главу 7).

* Процедура mstime - сообщает число истекших миллисекунд
*	.	
*/
long
mstime(unsigned long *pms) {
static struct timeval epoch; struct timeval now;
if (gettimeofday(&now, (struct timezone *)0))
errexit("gettimeofday: %s\n", strerror(errno)); if (!pms) {
epoch = now;
return 0;
}
*pms = (now.tv_sec - epoch.tv_sec) * 1000; *pms += (now.tvjisec - epoch.tvjisec + 500)/ 1000; return *pms;
 

17.8. Описание параллельной клиентской программы

Программа TCPtecho принимает в качестве параметров имена нескольких компьютеров. Для каждого компьютера она открывает соединение TCP с сервером ECHO на этом компьютере, посылает ccount символов (байтов) через соединение, считывает байты, полученные от каждого сервера, и выводит на экран значение общей продолжительности времени, которое потребовалось для выполнения этой задачи. Поэтому программа TCPtecho может применяться для одновременного выполнения нескольких измерений пропускной способности сети.

Работа программы TCPtecho начинается с установки применяемого по умолчанию начального значения переменной CCOUNT, которая содержит число передаваемых символов. Затем программа интерпретирует свои параметры для определения того, была ли введена пользователем опция -с. В случае положительного ответа программа TCPtecho преобразует заданное с помощью этой опции количество символов в целое число и записывает его в переменную ccount, перекрывая значение, применяемое по умолчанию.

В программе TCPtecho предполагается, что все параметры, отличные от заданного с помощью опции -с, указывают имя компьютера. Для каждого из таких параметров программа вызывает процедуру connectTCP для установления соединения TCP с сервером ECHO на указанном компьютере. Программа TCPtecho регистрирует имя компьютера в массиве hname и вызывает макрокоманду FDJ3ET для установки в маске дескрипторов файлов бита, соответствующего данному сокету. Программа также записывает максимальный номер дескриптора в переменную maxfd (которая нужна для вызова функции select).

После установления соединения TCP с каждым компьютером, указанным в качестве параметров, главная процедура программы TCPtecho вызывает процедуру TCPtecho для передачи и приема данных. Эта процедура обслуживает все соединения одновременно, заполняет буфер buf данными, которые должны быть переданы (повторяющиеся буквы D), а затем вызывает функцию select для перехода в состояние ожидания готовности любого соединения TCP к вводу или выводу. После возврата управления из функции select процедура TCPtecho проверяет в цикле все дескрипторы и определяет, какой из них готов к работе.

Если какое-то соединение готово для вывода, процедура TCPtecho вызывает процедуру writer для передачи такого объема данных из буфера, какой может быть принят протоколом TCP в одном вызове функции write. Если процедура writer обнаружит, что передан весь буфер, она вызывает функцию shutdown, чтобы закрыть дескриптор для вывода, и удаляет этот дескриптор из набора дескрипторов вывода, используемого функцией select. http://www.str-climat.ru/

Если какой-либо дескриптор готов для ввода, процедура TCPtecho вызывает процедуру reader, которая принимает такой объем данных из соединения, какой может быть доставлен программным обеспечением протокола TCP, и помещает их в буфер. Процедура reader считывает данные в буфер и уменьшает число оставшихся символов в соответствии с объемом полученных данных. Если число оставшихся символов достигает нуля (т.е. клиент получил такое же число символов, какое было им отправлено), процедура reader определяет, сколько времени прошло с момента начала передачи данных, выводит сообщение и закрывает соединение. Она также удаляет дескриптор из набора дескрипторов ввода, используемого функцией select. Поэтому сообщение с указанием общего количества времени, которое потребовалось для эхо-повтора данных, появляется на устройстве вывода после закрытия каждого соединения.

После выполнения в соединении одной операции ввода или вывода каждая из процедур reader и writer выполняет возврат, цикл в процедуре TCPtecho повторяется и снова вызывается функция select. Процедура reader возвращает значение О, если обнаружен признак конца файла и закрыто соединение, и значение 1 — в ином случае. В процедуре TCPtecho используется код возврата процедуры reader для определения того, следует ли уменьшить на единицу число активных соединений. После того как число активных соединений достигает нуля, цикл в процедуре TCPtecho завершается, эта процедура возвращает управление главной процедуре и работа клиентской программы прекращается.

В листинге 17.1 показан пример вывода, полученного в результате трех отдельных вызовов на выполнение программы TCPtecho. Результаты первого вызова показывают, что программе TCPtecho потребовалось только 311 миллисекунд для передачи данных на сервер ECHO, установленный на локальном компьютере. В командной строке был указан один параметр localhost. Поскольку при втором вызове использовалось три параметра (ector, arthur и merlin), в нем программа TCPtecho применялась для обмена данными со всеми тремя компьютерами одновременно. В третьем вызове было предусмотрено измерение количества времени, необходимого для достижения компьютера sage, но в командной строке было указано, что программа TCPtecho должна отправить только 1000 символов вместо значения, применяемого по умолчанию (64 Кбайт). Для получения ответа от компьютера требовалось больше времени, если он находился дальше от клиента или имел более медленный процессор.

Похожие статьи