LINUX.ORG.RU

Пример программы UDP-сервера


0

1
#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>
#include <stdlib.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;
}

Программа выводит ошибки , в чем дело помогите))

10_2.cpp: В функции «int main()»:

10_2.cpp:50:84: ошибка: некорректное преобразование из «int*» в «socklen_t* {aka unsigned int*}» [-fpermissive]

/usr/include/i386-linux-gnu/sys/socket.h:166:16: ошибка: при инициализации 6 -го аргумента «ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*)» [-fpermissive]

в чем дело помогите))

Ты вызываешь функцию с аргументом int*, а должен с unsigned int*.

Deleted
()

Вас обманули (локализаторы). Это не ошибки, а предупреждения (warning). Они значат, что в этом месте потенциально ошибка. Что конкретно у вас - написали выше.

stopitplease
()
Ответ на: комментарий от stopitplease

Хотя смотря как вы собираете. Просто cc -o server server.c должен быть warning

stopitplease
()
Ответ на: комментарий от Deleted

И таки да, в программе у тебя heartbleed-style уязвимость.

Deleted
()
Ответ на: комментарий от vvviperrr

с socklen_t * же, ну.

Да, но я хотел обратить внимание именно на signed/unsigned.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.