Network in phobos

Adam Ruppe destructionator at gmail.com
Sat Mar 27 19:38:12 PDT 2010


Something that I think would be nice is being able to treat a network
connection the same way we can work with files and stdin.

Is there a plan already in place for phobos? If no, I might have
something usable to get started.

I peered into std.stdio's source and hacked something up. My plan was
simple: open the network, then assign the FILE* to it to the File
struct.

This is just for Linux; I haven't done Windows code like this for a
long time and I don't remember how. But this might be a useful
starting point anyway, so I figure I'll share it.


What I'd ultimately like is something like this for all D platforms,
and an add-on facility for handling multiple connections, including
incoming connections. I actually have something for this too, but it
is incompatible with the File struct (and Linux only again).


=========
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;
}
========



More information about the Digitalmars-d mailing list