Создание объекта сокета по файловому дескриптору

У меня есть файловый дескриптор (0/stdin), для которого я хочу построить объект Socket в D. Как мне это сделать? Кажется, для этого нет подходящего конструктора.


person Jeroen    schedule 26.10.2013    source источник


Ответы (1)


Есть конструктор с пометкой «использовать существующий дескриптор сокета», который принимает socket_t. Вы можете преобразовать int в socket_t (socket_t — это перечисление, основанное на int в системах Unix).

    // it requires an address family but i don't think it matters much
    auto socket = new Socket(cast(socket_t) 0, AddressFamily.INET);

Это позволит вам построить, хотя затем его использование приводит к ошибкам «Операция сокета на не-сокете», потому что сокет D вызывает send () и recv (), а не запись () и чтение (), поэтому я не уверен, как на самом деле сделать его полезным...

person Adam D. Ruppe    schedule 26.10.2013
comment
Ну, это работало хорошо для меня! Мое приложение запускается, поэтому стандартный входной поток фактически является сокетом. На самом деле не думал, что socket_t будет дескриптором файла. - person Jeroen; 26.10.2013
comment
А, конечно, прикольно. Кстати, если вы хотите пойти другим путем, есть метод Socket.handle(), который возвращает socket_t. В некоторых случаях он будет неявно приведен к типу int, но если нет, вы также можете явно привести его, а затем использовать для него обычные файловые функции unix. - person Adam D. Ruppe; 26.10.2013