Unix клиент дейтаграмм доменных сокетов только с получением - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть приложение-симулятор, которое Unix Доменные датаграммы, которое отправляет данные в путь к сокету для .ex / var / lib / XYZ. sendto возвращает -2, что связано с другим концом, и однорангового узла нет (другое приложение unix для сокетов domian не запущено)

Я хотел бы написать приложение клиент / партнер для дейтаграмм, используя Unix Доменные сокеты для получения данных с сервера / симулятора (который отправляет данные в /var/lib/XYZ).

Мой код выглядит следующим образом:

#define BUF_SIZE 1024

#define SV_SOCK_PATH "/var/lib/XYZ"
#define SV_SOCK_PATH2 "/var/lib/ABC"

создание Unix доменных сокетов как показано ниже:

    struct sockaddr_un svaddr, claddr;
    ....      

    sfd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (sfd == -1)
        printf("socket creation failed");

    memset(&claddr, 0, sizeof(struct sockaddr_un));
    claddr.sun_family = AF_UNIX;

    strncpy(claddr.sun_path, SV_SOCK_PATH2, sizeof(claddr.sun_path) - 1);

    if (bind(sfd, (struct sockaddr *) &claddr, sizeof(struct sockaddr_un)) == -1)
        printf("bind failed");

    /* Construct address of server */

    memset(&svaddr, 0, sizeof(struct sockaddr_un));
    svaddr.sun_family = AF_UNIX;
    strncpy(svaddr.sun_path, SV_SOCK_PATH, sizeof(svaddr.sun_path) - 1);



    while(1)
    {
     int len=sizeof(struct sockaddr_un);
     numBytes = recvfrom(sfd, resp, BUF_SIZE, 0, (struct sockaddr*)&svaddr,&len);
     if (numBytes == -1)
            printf("recvfrom error");
        else{
        printf("no of bytes received from server: %d",(int)numBytes);
        printf("Response %d: %s\n", (int) numBytes, resp);
       }


    }


    remove(claddr.sun_path);            
    //exit(EXIT_SUCCESS);
}

но программа ничего не получает ... что-то пропущено ??

1 Ответ

1 голос
/ 05 февраля 2020

Что касается дейтаграмм, то здесь нет реального клиента или сервера. Любая сторона, пытающаяся отправить сообщение, отвечает за передачу дейтаграмм другой стороне. Итак, в вашем коде все настройки неверны. Вы, очевидно, пытаетесь направить «сервер» (но на самом деле не сервер, а просто другой узел) для отправки вам через svaddr, но это не так.

Для сокета дейтаграммы AF_UNIX отправителю необходимо либо явно указать адрес получателя в вызове sendto, либо сначала connect свой сокет к адресу получателя. (В последнем случае он может использовать send вместо sendto, поскольку адрес партнера был указан с помощью connect.)

Вы не можете указать отправителя адрес партнера в вызове recvfrom. Аргумент адреса сокета в recvfrom предназначен для возврата вам адреса, с которого была отправлена ​​датаграмма. Все, что находится в этой переменной, будет перезаписано при успешном возврате из recvfrom.

. Односторонние программы одноранговых дейтаграмм часто структурированы: «сервер» создает известный путь и связывается с ним, затем «клиент». "создает свою собственную конечную точку и связывается с it (создавая уникальный адрес сокета для себя), тогда клиент может sendto известный сокет сервера. Сервер, используя recvfrom для получения адреса клиента вместе с дейтаграммой, может затем использовать sendto вместе с адресом для возврата сообщения клиенту (без необходимости connect его сокета). Это обеспечивает своего рода парадигму клиент-сервер поверх принципиально равноправной ориентации сокета дейтаграммы.

Наконец, я должен упомянуть, что обычно рекомендуется использовать полностью указанные имена путей, чтобы гарантировать, что оба узла используют один и тот же адрес, даже если они запускаются из разных каталогов. (Обычно при AF_UNIX адрес - это путь в файловой системе, используемый для «рандеву» между двумя узлами, поэтому без полного пути «some_socket» равно «./some_socket» в текущем рабочем каталоге. Некоторые Системы, такие как linux, также поддерживают абстрактное «скрытое» пространство имен, для которого не требуется полный путь, но вы должны использовать начальный нулевой байт в имени, чтобы указать это.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...