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




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


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

a.out 192.168.253.12

Ниже следует текст программы

/* Простой пример UDP клиента для сервиса 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> int main(int argc, char **argv) { int sockfd; /* Дескриптор сокета */ int n, len; /* Переменные для различных длин и количества символов */ char sendline[1000], recvline[1000]; /* Массивы для отсылаемой и принятой строки */ struct sockaddr_in servaddr, cliaddr; /* Структуры для адресов сервера и клиента */ /* Сначала проверяем наличие второго аргумента в командной строке. При его отсутствии ругаемся и прекращаем работу */ if(argc != 2){ printf("Usage: a.out <IP address>\n"); exit(1); } /* Создаем UDP сокет */ if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror(NULL); /* Печатаем сообщение об ошибке */ exit(1); } /* Заполняем структуру для адреса клиента: семейство протоколов TCP/IP, сетевой интерфейс – любой, номер порта по усмотрению операционной системы. Поскольку в структуре содержится дополнительное не нужное нам поле, которое должно быть нулевым, перед заполнением обнуляем ее всю */ bzero(&cliaddr, sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(0); cliaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Настраиваем адрес сокета */ if(bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0){ perror(NULL); close(sockfd); /* По окончании работы закрываем дескриптор сокета */ exit(1); } /* Заполняем структуру для адреса сервера: семейство протоколов TCP/IP, сетевой интерфейс – из аргумента командной строки, номер порта 7.


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