www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 4025] New: Making network with the std.stdio.File interface

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4025

           Summary: Making network with the std.stdio.File interface
           Product: D
           Version: 2.041
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: destructionator gmail.com


--- Comment #0 from Adam D. Ruppe <destructionator gmail.com> 2010-03-28
15:51:43 PDT ---
I've written a small module that opens a network connection, then wraps it in
the File struct, allowing you to use the byLine, etc., ranges on it, as well as
writef/readln/etc.

It is Linux only, but should be pretty easy to port to other operating systems.
Ideally, I'd like to eventually be able to use File for talking
to processes too, on all D platforms. 

Here's the code I have for now:

==============



public import std.stdio;
import std.string;

import std.conv;

version(linux):

import std.c.linux.linux;
import std.c.linux.socket;

alias std.c.linux.socket sock;
alias std.c.linux.linux linux;

enum int PF_INET = 2;
enum int AF_INET = PF_INET;

extern(C) FILE* fdopen(int, const(char)*);

File openNetwork(string host, ushort port) {
    hostent* h;
    sockaddr_in addr;

    h = gethostbyname(std.string.toStringz(host));
    if(h is null)
        throw new StdioException("gethostbyname");

    int s = socket(PF_INET, SOCK_STREAM, 0);
    if(s == -1)
        throw new StdioException("socket");

    scope(failure)
        close(s);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    std.c.string.memcpy(&addr.sin_addr.s_addr, h.h_addr, h.h_length);

    if(sock.connect(s, cast(sockaddr*) &addr, addr.sizeof) == -1)
        throw new StdioException("Connect failed");

    FILE* fp = fdopen(s, "w+".ptr);

    File f;

    auto imp = new File.Impl(fp, 1, host ~ ":" ~ to!string(port));

    f.p = imp;

    return f;
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 28 2010
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4025


Andrei Alexandrescu <andrei metalanguage.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
                 CC|                            |andrei metalanguage.com
         AssignedTo|nobody puremagic.com        |andrei metalanguage.com


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 28 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4025


Vladimir Panteleev <thecybershadow gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |thecybershadow gmail.com


--- Comment #1 from Vladimir Panteleev <thecybershadow gmail.com> 2011-08-23
19:31:06 PDT ---
Some thoughts:

* The concept is POSIX-only. Windows uses different APIs and handles for files
and network connections.
* I'm not sure why you used the C socket functions when you could have used
std.socket for the setup and obtained the handle. This could have shortened the
code considerably. (One drawback against using std.socket I can see is that its
destructor closes the socket, so you must maintain a reference to the Socket
object.)
* Perhaps std.stdio.File should just have public constructors which accept a
FILE* or (on POSIX) a file descriptor. This would eliminate the need for such
dedicated code, and instead provide better general support (for pipes and
whatever else file descriptors are used for).
* Alternatively, there's always std.socketstream...

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 23 2011