[phobos] Fwd: [Issue 4025] New: Making network with the std.stdio.File interface

Walter Bright walter at digitalmars.com
Mon Mar 29 15:19:32 PDT 2010


I had a long conversation with Andrei about a similar topic, i.e. 
dealing with zip files. We concluded that the zip file library should 
know nothing about files or file streams. It should work with ranges. 
Similarly, designs like "make this memory buffer look like a file 
stream" are completely wrong for modern designs. It should be "make a 
file look like a range" and "make a memory buffer look like a range" and 
then have the reader/writer operate on ranges.

The same should hold for network access.

Steve Schveighoffer wrote:
> I have no problem with Adam joining.  As far as the network library, do we want to increase our dependency on the C FILE* structure/api?  I would not want that.  I don't know a lot of network solutions that put a socket fd inside a FILE *, there's probably good reason for that.
>
> As long as there's a non-buffered solution that allows socket-like functions accessible, I'm cool with File wrapping a socket.  That is, there should be a way to create a socket with the API that doesn't use File.
>
> I hope we will eventually get a D-only solution for File.  Good news is, any future improvements to File automatically translate to what Adam is working on.
>
> -Steve
>
>
>
> ----- Original Message ----
>   
>> From: Andrei Alexandrescu <andrei at erdani.com>
>> To: Discuss the phobos library for D <phobos at puremagic.com>
>> Sent: Sun, March 28, 2010 7:21:20 PM
>> Subject: [phobos] Fwd: [Issue 4025] New: Making network with the std.stdio.File interface
>>
>> 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: 
>   
>> ymailto="mailto:d-bugmail at puremagic.com" 
>> href="mailto:d-bugmail at puremagic.com">d-bugmail at puremagic.com
>>     
> Organization: 
>   
>> Digital Mars
>>     
> To: 
>   
>> href="mailto:digitalmars-d-bugs at puremagic.com">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: 
>> href="mailto:nobody at puremagic.com">nobody at puremagic.com
>>     
>     
>   
>>     ReportedBy: 
>> href="mailto:destructionator at gmail.com">destructionator at gmail.com
>>     
>
>
> --- 
>   
>> Comment #0 from Adam D. Ruppe <
>> href="mailto:destructionator at gmail.com">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
>>     
>
>   
>> href="mailto:phobos at puremagic.com">phobos at puremagic.com
>>     
> http://lists.puremagic.com/mailman/listinfo/phobos
>
>
>       
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>
>
>   


More information about the phobos mailing list