Локальные сокеты PF_LOCAL, повторное открытие

Тема в разделе "WASM.UNIX", создана пользователем dimax, 25 май 2009.

  1. dimax

    dimax New Member

    Публикаций:
    0
    Регистрация:
    21 май 2009
    Сообщения:
    11
    Можно ли открыть существующий локальный сокет, (имеется в виду семейство PF_LOCAL)?

    Пробовал:

    fd=open("/home/user/sockets/sock", O_RDWR);

    получаю fd=-1, errno: Operation not supported.

    понятно, что можно каждый раз:

    sock=socket(PF_LOCAL, SOCK_STREAM, 0);
    unlink("/home/user/sockets/sock");
    strcpy(sname.sun_path, "/home/user/sockets/sock");
    bind(sock, &sname, ...);
    listen(...);

    именно bind создает файл /home/user/sockets/sock, но после
    close(sock) и после завершения процесса файл не удаляется.
    /home/user/sockets/sock - особый файл, с пометкой, что это сокетный файл.
    open на него не действует ...
    можно ли как-либо определить потом что это было TCP или UDP?
     
  2. dimax

    dimax New Member

    Публикаций:
    0
    Регистрация:
    21 май 2009
    Сообщения:
    11
    Для FIFO, например, есть mkfifo, которая делает особый FIFO-файл в файловой системе.
    Потом этот файл можно открыть open, читать, писать read и write из двух разных процессов.

    А вот для сокетов пока не нашел подобного вызова для создания (только bind)...
    И открыть его не получается с помощью open... Такой псевдо-файл остается в файловой системе
    и после работы проги.

    Кто нибудь что-то знает про открытие существующего локального сокета?
     
  3. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    а обязательно ли открывать локальный сокет?насколько я понял, локальный сокет - это сокет,не выходящий в физическую линию.так нельзя ли поставить сокет на прослушку по айпи 127.0.0.1?
     
  4. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    да, и кстати говоря, когда создаёш сокет , указываеш, какого он типа - TCP или UDP(значения SOCK_STREAM и SOCK_DGRAM соответственно)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    6opoDuJIo
    Сокеты бывают не только типа inet >.<
     
  6. dimax

    dimax New Member

    Публикаций:
    0
    Регистрация:
    21 май 2009
    Сообщения:
    11
    Локальные сокеты это не inet-сокеты. Они служат для взаимодействия процессов на одной системе.
    До меня дошло вот что. На сокет надо делать сначала connect()! Что вполне логично. :)

    Но если локальный сокет уже живет на файловой системе, и на нем никто не listen(), то connect(), естественно вернет errno: Connect refused. (Проверено).

    Другой процесс (сервер) сначала должен сделать unlink, потом bind, listen и далее в цикле accept.

    вот только между unlink и bind другой процесс может попытаться bind.

    proc1: unlink
    proc2: bind
    proc1: bind -- errno: bind failed adderess already in use
    proc2: listen
    ....

    и всеже хорошо бы отрыть на listen() уже имеющийся локальный сокет в процессе-сервере!
     
  7. dimax

    dimax New Member

    Публикаций:
    0
    Регистрация:
    21 май 2009
    Сообщения:
    11
    Может кто еще чего знает?