реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Linux. Нужно написать программу-сервер, отсылающую клиенту блок данных по UDP
kovigor
сообщение Sep 11 2012, 17:26
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Осваиваю работу с сокетами в Linux. В качестве Linux-машины использую отладочную плату на МП от FreeScale. Разобрался с тем, как создавать сокет и как через этот сокет запросить данные с WEB-страницы удаленного сервера. Запрограммировал, проверил. Работает. Теперь решаю в некотором роде обратную задачу: пытаюсь написать программу, слушающую заданный сетевой порт и при получении запроса от клиента, работающего, например, на PC, отсылающую этому клиенту блок данных по UDP, например, ASCII - строку вроде "Hello, World !". Посоветуйте, пожалуйста, что мне почитать, чтобы решить мою задачу ...
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Sep 11 2012, 21:17
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Самый быстрый способ - 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 не сильно изуродованы виндовыми тайпдефами для каждого случая жизни и венгерской нотацией.

Сообщение отредактировал Cosmojam - Sep 12 2012, 08:57


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 12 2012, 04:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Понял. Большое спасибо ...
Go to the top of the page
 
+Quote Post
kurtis
сообщение Sep 13 2012, 09:16
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



http://beej.us/guide/bgnet/ или Richard Stevens
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01367 секунд с 7
ELECTRONIX ©2004-2016