[phobos] Fwd: [Issue 4025] New: Making network with the std.stdio.File interface
Sean Kelly
sean at invisibleduck.org
Sun Mar 28 19:23:54 PDT 2010
Aye.
On Mar 28, 2010, at 4:21 PM, Andrei Alexandrescu wrote:
> I'm quite hopeful about this development. If we have anything for the network in D2, that would be great, and integration with File will reuse a ton of work.
>
> I'm considering extending Adam an offer to join Phobos. He has donated a Windows machine for building and running Phobos and generally seems to know what he's talking about. If he'll join the project, my hope is to attract him to dedicate more time to it.
>
> Please cast your vote by replying (silence = abstaining, i.e. you're not for or against).
>
>
> Andrei
>
> -------- Original Message --------
> Subject: [Issue 4025] New: Making network with the std.stdio.File interface
> Date: Sun, 28 Mar 2010 22:51:45 +0000 (UTC)
> From: d-bugmail at puremagic.com
> Organization: Digital Mars
> To: digitalmars-d-bugs at puremagic.com
> Newsgroups: digitalmars.D.bugs
>
> 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 at puremagic.com
> ReportedBy: destructionator at gmail.com
>
>
> --- Comment #0 from Adam D. Ruppe <destructionator at 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;
> }
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
More information about the phobos
mailing list