Слушание сокета используя glib/gio

Автор swank, 28 мая 2018, 17:30:58

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

swank

Решил попробовать использовать glib, начал портировать одну из своих программ, но не как не могу начать слушать unix сокет, вот код программы:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <glib.h>
#include <gio/gio.h>
#include <gio/gunixsocketaddress.h>

#define UNIX_PATH "echo.sock"

int main() {
    GSocketService *service = g_socket_service_new();
    GSocketAddress *addr = g_unix_socket_address_new(UNIX_PATH);
    g_assert(addr);

    GError *err = NULL;
    gboolean ret = g_socket_listener_add_address(
        G_SOCKET_LISTENER(service),
        addr,
        G_SOCKET_TYPE_DATAGRAM,
        G_SOCKET_PROTOCOL_DEFAULT,
        NULL,
        NULL,
        &err
    );
    if (!ret) {
    g_critical("Unable to add listen address: %s\n", err->message);
        goto err;
    }

    return 0;

    err:
        g_error_free(err);
        return 1;
}

компилирую так:
Цитироватьgcc -g3 -O0 -ggdb3 $(pkg-config --cflags --libs glib-2.0 gio-unix-2.0) test.c
При запуске получаю:
Цитировать** (process:5224): CRITICAL **: 17:26:51.811: Unable to add listen address: could not listen: Operation not supported
Не понимаю почему так, если я заменяю G_SOCKET_TYPE_DATAGRAM на G_SOCKET_TYPE_STREAM, то все начинает работать нормально, только вот мне нужно именно G_SOCKET_TYPE_DATAGRAM

Cообщение объединено 28 мая 2018, 17:59:07

Глянул вывод strace, там вызывается системный вызов listen, GSocketService судя по всему предназначен только для G_SOCKET_TYPE_STREAM, а для G_SOCKET_TYPE_DATAGRAM нужно делать все без абстракций