debian.org / О Debian Где взять Debian Поддержка Уголок разработчика Новости Wiki

Автор Тема: Слушание сокета используя glib/gio  (Прочитано 525 раз)

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

Оффлайн swank

  • Новичок форума
  • Topic Author
  • Сообщений: 9
Решил попробовать использовать 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 нужно делать все без абстракций
« Последнее редактирование: 28 Май 2018, 17:59:07 от swank »
 

Русскоязычное сообщество Debian GNU/Linux



Теги: