Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Linux. Нужно написать программу-сервер, отсылающую клиенту блок данных по UDP
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
kovigor
Осваиваю работу с сокетами в Linux. В качестве Linux-машины использую отладочную плату на МП от FreeScale. Разобрался с тем, как создавать сокет и как через этот сокет запросить данные с WEB-страницы удаленного сервера. Запрограммировал, проверил. Работает. Теперь решаю в некотором роде обратную задачу: пытаюсь написать программу, слушающую заданный сетевой порт и при получении запроса от клиента, работающего, например, на PC, отсылающую этому клиенту блок данных по UDP, например, ASCII - строку вроде "Hello, World !". Посоветуйте, пожалуйста, что мне почитать, чтобы решить мою задачу ...
Cosmojam
Самый быстрый способ - https://www.google.com/search?hl=en&new...c.1.SZtx9gFkW8A полно примеров с объяснениям, всё достаточно просто.

Код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>

int main(int argc, char *argv[])
{
    int sock = -1;
    unsigned short port = 9999u;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock < 0)
    {
        perror("socket");
        return EXIT_FAILURE;
    }

    memset((void *) &addr, 0x00, sizeof addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = INADDR_ANY;
    if (bind(sock, (struct sockaddr*) &addr, sizeof addr) != 0)
    {
        perror("bind");
        return EXIT_FAILURE;
    }

    int bytes = 0;
    char buffer[128] =    {0};
    while(bytes >= 0)
    {
        int addr_len = sizeof addr;

        bytes = recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr*)&addr, &addr_len);
        if(bytes == 0)
        {
            printf("Transfer aborted by peer\n");
        }
        else if(bytes < 0)
        {
            perror("recvfrom");
        }
        else
        {
            if(strcmp(buffer, "Tell me something") == 0)
            {
                const char *ack = "Hello, world!";
                sendto(sock, ack, strlen(ack), 0, (struct sockaddr*)&addr,    sizeof addr);
            }
        }
                memset((void *)buffer, '\0', sizeof buffer);
    }
    close(sock);
    return EXIT_SUCCESS;
}

Это concurrent сервер т.е. все запросы в одном цикле, подходит для UDP. Для TCP обычно делают в цикле блокирующий вызов accept, который возвращает сокет для нового клиента и для этого клиента создаётся новый поток, либо асинхронный ввод-вывод с помощью select.
По сокетам очень много в сети информации и примеров с объяснениями https://www.google.com/search?hl=en&new...c.1.98bOenqjQYs. Я, как ни странно, это более пристально изучал по книге "Johnson M. Hart - Windows system programming", к счастью сокеты в WinAPI не сильно изуродованы виндовыми тайпдефами для каждого случая жизни и венгерской нотацией.
kovigor
Понял. Большое спасибо ...
kurtis
http://beej.us/guide/bgnet/ или Richard Stevens
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.