Профтемы студенту и преподавателю
Taketop.ru
СТУДЕНТУ И ПРЕПОДАВАТЕЛЮ
лекции по дисциплинам
Информатика и вычислительная техника :: Операционные системы и среды
Пример программы UDP-сервера
Поскольку UDP-сервер использует те же самые системные вызовы, что и UDP-клиент, мы можем сразу приступить к рассмотрению примера UDP-сервера (программа 15–16-2.с) для сервиса echo.
/* Простой пример 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 sockfd; /* Дескриптор сокета */
    int clilen, n; /* Переменные для различных длин
        и количества символов */
    char line[1000]; /* Массив для принятой и
        отсылаемой строки */
    struct sockaddr_in servaddr, cliaddr; /* Структуры
        для адресов сервера и клиента */
    /* Заполняем структуру для адреса сервера: семейство
    протоколов TCP/IP, сетевой интерфейс – любой, номер порта
    51000. Поскольку в структуре содержится дополнительное не
    нужное нам поле, которое должно быть нулевым, перед
    заполнением обнуляем ее всю */
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(51000);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    /* Создаем UDP сокет */
    if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){
        perror(NULL); /* Печатаем сообщение об ошибке */
        exit(1);
    }
    /* Настраиваем адрес сокета */
    if(bind(sockfd, (struct sockaddr *) &servaddr,
    sizeof(servaddr)) < 0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    while(1) {
        /* Основной цикл обслуживания*/
        /* В переменную clilen заносим максимальную длину
        для ожидаемого адреса клиента */
        clilen = sizeof(cliaddr);
        /* Ожидаем прихода запроса от клиента и читаем его.
        Максимальная допустимая длина датаграммы – 999
        символов, адрес отправителя помещаем в структуру
        cliaddr, его реальная длина будет занесена в
        переменную clilen */
        if((n = recvfrom(sockfd, line, 999, 0,
        (struct sockaddr *) &cliaddr, &clilen)) < 0){
            perror(NULL);
            close(sockfd);
            exit(1);
        }
        /* Печатаем принятый текст на экране */
        printf("%s\n", line);
        /* Принятый текст отправляем обратно по адресу
        отправителя */
        if(sendto(sockfd, line, strlen(line), 0,
        (struct sockaddr *) &cliaddr, clilen) < 0){
            perror(NULL);
            close(sockfd);
            exit(1);
        } /* Уходим ожидать новую датаграмму*/
    }
    return 0;
}
Листинг 15-16.2. Программа 15–16-2.c . Простой пример UDP-сервера для сервиса echo.  
Наберите и откомпилируйте программу. Запустите ее на выполнение. Модифицируйте текст программы UDP-клиента (программа 15–16-1.c), заменив номер порта с 7 на 51000. Запустите клиента с другого виртуального терминала или с другого компьютера и убедитесь, что клиент и сервер взаимодействуют корректно.


Работы, представленные на сайте http://taketop.ru, предназначено исключительно для ознакомления. Все права в отношении работ и/или содержимого работ, представленных на сайте http://taketop.ru, принадлежат их законным правообладателям. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие или полученные в связи с использованием работ и/или содержимого работ, представленных на сайте http://taketop.ru
Рейтинг@Mail.ru
Сайт управляется SiNG cms © 2010-2015