digitalmars.D.bugs - [Issue 4025] New: Making network with the std.stdio.File interface
- d-bugmail puremagic.com (57/57) Mar 28 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4025
- d-bugmail puremagic.com (10/10) Mar 28 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4025
- d-bugmail puremagic.com (22/22) Aug 23 2011 http://d.puremagic.com/issues/show_bug.cgi?id=4025
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 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
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
http://d.puremagic.com/issues/show_bug.cgi?id=4025 Vladimir Panteleev <thecybershadow gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |thecybershadow gmail.com 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