www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - wrapSocket for socket_t? As wrapFile for FILE*

reply Beginner-8 <qwe asd.com> writes:
Hi!

Anyone seen Socket constructor which uses already available 
socket of socket_t type?

I am need to use already connected socket imported from C library 
without closing them after using.
Feb 13 2016
next sibling parent Adam D. Ruppe <destructionator gmail.com> writes:
On Sunday, 14 February 2016 at 04:13:12 UTC, Beginner-8 wrote:
 Anyone seen Socket constructor which uses already available 
 socket of socket_t type?
See the list on my unofficial docs here: http://dpldocs.info/experimental-docs/std.socket.Socket.html This one does it: http://dpldocs.info/experimental-docs/std.socket.Socket.this.5.html or the official docs here: http://dlang.org/phobos/std_socket.html#.Socket.this.3 But basically you can just do: auto socket = new Socket(your_socket_t, AddressFamily.INET); // or whatever it is AddressFamilies are: http://dpldocs.info/experimental-docs/std.socket.AddressFamily.html
Feb 13 2016
prev sibling parent reply tcak <1ltkrs+3wyh1ow7kzn1k sharklasers.com> writes:
On Sunday, 14 February 2016 at 04:13:12 UTC, Beginner-8 wrote:
 Hi!

 Anyone seen Socket constructor which uses already available 
 socket of socket_t type?

 I am need to use already connected socket imported from C 
 library without closing them after using.
One of the constructors of class Socket is as follows: pure nothrow nogc safe this(socket_t sock, AddressFamily af); socket_t is basically a file descriptor which is the type "int". Your C library provides you "socket_t" value already as far as I understand. So, you can pass it to constructor. Unless you explicitly call "close" method of Socket object, its descriptor will stay allocated for your process/program.
Feb 13 2016
parent reply Beginner-8 <qwe asd.com> writes:
On Sunday, 14 February 2016 at 06:01:11 UTC, tcak wrote:

 Unless you explicitly call "close" method of Socket object, its 
 descriptor will
 stay allocated for your process/program.
Hmm, I am seen what Socket dtor contains close() too: https://github.com/D-Programming-Language/phobos/blob/master/std/socket.d#L2659
Feb 13 2016
parent reply Beginner-8 <qwe asd.com> writes:
On Sunday, 14 February 2016 at 06:10:04 UTC, Beginner-8 wrote:
 On Sunday, 14 February 2016 at 06:01:11 UTC, tcak wrote:

 Unless you explicitly call "close" method of Socket object, 
 its descriptor will
 stay allocated for your process/program.
Hmm, I am seen what Socket dtor contains close() too: https://github.com/D-Programming-Language/phobos/blob/master/std/socket.d#L2659
I would say that the socket should not be closed by my code. For files this way is wrapFile: "The resulting File never takes the initiative in closing the file." http://dlang.org/library/std/stdio/file.wrap_file.html It seems that something like this is necessary also for Socket.
Feb 13 2016
next sibling parent Beginner-8 <qwe asd.com> writes:
(I went to make a patch to Phobos)
Feb 13 2016
prev sibling parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 02/13/2016 10:38 PM, Beginner-8 wrote:
 On Sunday, 14 February 2016 at 06:10:04 UTC, Beginner-8 wrote:
 On Sunday, 14 February 2016 at 06:01:11 UTC, tcak wrote:

 Unless you explicitly call "close" method of Socket object, its
 descriptor will
 stay allocated for your process/program.
Hmm, I am seen what Socket dtor contains close() too: https://github.com/D-Programming-Language/phobos/blob/master/std/socket.d#L2659
I would say that the socket should not be closed by my code. For files this way is wrapFile: "The resulting File never takes the initiative in closing the file." http://dlang.org/library/std/stdio/file.wrap_file.html It seems that something like this is necessary also for Socket.
Maybe another option is to duplicate the socket handle before giving it to Socket but I am failing to find a definitive answer or an example. Ali
Feb 13 2016
parent reply Beginner-8 <qwe asd.com> writes:
On Sunday, 14 February 2016 at 07:33:11 UTC, Ali Çehreli wrote:

 Maybe another option is to duplicate the socket handle
Sure! Nevertheless, it is need method for socket_t duplication. Something like: class Socket { ... static Socket dup(socket_t) ... }
 before giving it to Socket but I am failing to find a 
 definitive answer or an example.
Feb 13 2016
parent reply Beginner-8 <qwe asd.com> writes:
Uh, wait! Forgot about that Socket calls .close() in its dtor
Feb 14 2016
parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 02/14/2016 12:03 AM, Beginner-8 wrote:
 Uh, wait! Forgot about that Socket calls .close() in its dtor
Try duplicating the socket handle before handing it over to Socket (not compiled nor tested): import core.sys.posix.unistd; Socket(dup(myHandle)) I think socket handles are duplicatable :p things. Only the last close() would actually close the socket. Ali
Feb 14 2016
parent Beginner-8 <qwe asd.com> writes:
On Sunday, 14 February 2016 at 08:19:16 UTC, Ali Çehreli wrote:
 On 02/14/2016 12:03 AM, Beginner-8 wrote:
 Uh, wait! Forgot about that Socket calls .close() in its dtor
Try duplicating the socket handle before handing it over to Socket (not compiled nor tested): import core.sys.posix.unistd; Socket(dup(myHandle)) I think socket handles are duplicatable :p things. Only the last close() would actually close the socket. Ali
This recipe works for me! Thanks!
Feb 14 2016