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




Пример программы TCP-клиента


Рассмотрим пример – программу 15–16-3.с. Это простой TCP-клиент, обращающийся к стандартному системному сервису echo. Стандартный сервис принимает от клиента текстовую датаграмму и, не изменяя ее, отправляет обратно. За сервисом зарезервирован номер порта 7. Заметим, что это порт 7 TCP – не путать с портом 7 UDP из примера в разделе "Пример программы UDP-клиента"! Для правильного запуска программы необходимо указать символьный IP-адрес сетевого интерфейса компьютера, к сервису которого требуется обратиться, в качестве аргумента командной строки, например:

a.out 192.168.253.12

Для того чтобы подчеркнуть, что после установления логического соединения клиент и сервер могут обмениваться информацией неоднократно, клиент трижды запрашивает текст с экрана, отсылает его серверу и печатает полученный ответ. Ниже представлен текст программы.

/* Простой пример TCP-клиента для сервиса echo */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <errno.h> #include <unistd.h> void main(int argc, char **argv) { int sockfd; /* Дескриптор сокета */ int n; /* Количество переданных или прочитанных символов */ int i; /* Счетчик цикла */ char sendline[1000],recvline[1000]; /* Массивы для отсылаемой и принятой строки */ struct sockaddr_in servaddr; /* Структура для адреса сервера */ /* Сначала проверяем наличие второго аргумента в командной строке. При его отсутствии прекращаем работу */ if(argc != 2){ printf("Usage: a.out <IP address>\n"); exit(1); } /* Обнуляем символьные массивы */ bzero(sendline,1000); bzero(recvline,1000); /* Создаем TCP сокет */ if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0){ perror(NULL); /* Печатаем сообщение об ошибке */ exit(1); } /* Заполняем структуру для адреса сервера: семейство протоколов TCP/IP, сетевой интерфейс – из аргумента командной строки, номер порта 7. Поскольку в структуре содержится дополнительное не нужное нам поле, которое должно быть нулевым, перед заполнением обнуляем ее всю */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(51000); if(inet_aton(argv[1], &servaddr.sin_addr) == 0){ printf("Invalid IP address\n"); close(sockfd); exit(1); } /* Устанавливаем логическое соединение через созданный сокет с сокетом сервера, адрес которого мы занесли в структуру */ if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){ perror(NULL); close(sockfd); exit(1); } /* Три раза в цикле вводим строку с клавиатуры, отправляем ее серверу и читаем полученный ответ */ for(i=0; i<3; i++){ printf("String => "); fflush(stdin); fgets(sendline, 1000, stdin); if( (n = write(sockfd, sendline, strlen(sendline)+1)) < 0){ perror("Can\'t write\n"); close(sockfd); exit(1); } if ( (n = read(sockfd,recvline, 999)) < 0){ perror("Can\'t read\n"); close(sockfd); exit(1); } printf("%s", recvline); } /* Завершаем соединение */ close(sockfd); }

Листинг 15-16.3. Программа 15–16-3.c . Простой пример TCP-клиента для сервиса echo.

Наберите и откомпилируйте программу. Перед запуском "узнайте у своего системного администратора", запущен ли в системе стандартный TCP-сервис echo и, если нет, попросите это сделать. Запустите программу с запросом к сервису своего компьютера, к сервисам других компьютеров. Если в качестве IP-адреса указать несуществующий адрес или адрес выключенной машины, то программа сообщит об ошибке при работе вызова connect() (правда, возможно, придется подождать окончания timeout’а). При задании адреса компьютера, на котором не работает сервис echo, об ошибке станет известно сразу же. Протокол TCP является надежным протоколом. Если логическое соединение установить не удалось, то отправитель будет знать об этом.




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