www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Socket sample (and others) in DMD/samples

reply Sam Hu <samhudotsamhu gmail.com> writes:
I was wondering why some of the samples accompany with DMD2032 can not get
compiled?If they are not updated together with DMD,why bother include them?It
may confuses ppl who are new to D  the first time to give D a try but found
that it does not work.

Given below sample from DMD/samples/d/htmlget.d,it does not compiled ,one of
the error source is from char[][] vs string.After a couple of modification,now
it looks like this:


/*
	HTMLget written by Christopher E. Miller
	This code is public domain.
	You may use it for any purpose.
	This code has no warranties and is provided 'as-is'.
*/


//debug = HTMLGET;


module htmlget;
import std.string, std.conv, std.stream;
import std.socket, std.socketstream;
import std.stdio;

int main(string[] args)
{
	uint addr;
	if(args.length < 2)
	{
		printf("Usage:\n   htmlget <web-page>\n");
		return 0;
	}
	string url = args[1];
	int i;
	
	//i = std.string.find(url, "://");
	i=std.string.indexOf(url,"://");
	if(i != -1)
	{
		if(icmp(url[0 .. i], "http"))
			throw new Exception("http:// expected");
	}
	


	if(i != -1) // Remove anchor ref.
		url = url[0 .. i];
	
	//i = std.string.find(url, '/');
	i=std.string.indexOf(url,'/');
	string domain;
	if(i == -1)
	{
		domain = url;
		url = "/";
	}
	else
	{
		domain = url[0 .. i];
		url = url[i .. url.length];
	}
	
	uint port;
	//i = std.string.find(domain, ':');
	i=std.string.indexOf(domain,':');
	
	if(i == -1)
	{
		port = 80; // Default HTTP port.
	}
	else
	{
		//port = std.conv.toUshort(domain[i + 1 .. domain.length]);
		port=std.conv.to!(ushort)(domain[i+1..domain.length]);
		domain = domain[0 .. i];
	}
	addr=InternetAddress.parse(domain);
	debug(HTMLGET)
		printf("Connecting to " ~ domain ~ " on port " ~ std.string.to!string(port) ~
"...\n");
	
	auto Socket sock = new TcpSocket(new
std.socket.InternetAddress(addr/*domain*/, port));
	Stream ss = new SocketStream(sock);
	
	debug(HTMLGET)
		printf("Connected!\nRequesting URL \"" ~ url ~ "\"...\n");
	
	if(port != 80)
	{
		char[] temp=cast(char[]) domain;
		temp=temp~cast(char[])":" ~cast(char[]) std.string.to!string(port);
		domain=cast(string)temp;
		//domain = domain ~ ":" ~ std.string.to!string(port);
	}
	ss.writeString("GET " ~ url ~ " HTTP/1.1\r\n"
		"Host: " ~ domain ~ "\r\n"
		"\r\n");
	
	// Skip HTTP header.
	string line;
	for(;;)
	{
		line = cast(string)ss.readLine();
		if(!line.length)
			break;
		
		const string CONTENT_TYPE_NAME = "Content-Type: ";
		if(line.length > CONTENT_TYPE_NAME.length &&
			!icmp(CONTENT_TYPE_NAME, line[0 .. CONTENT_TYPE_NAME.length]))
		{
			string type;
			type = line[CONTENT_TYPE_NAME.length .. line.length];
			if(type.length <= 5 || icmp("text/", type[0 .. 5]))
				throw new Exception("URL is not text");
		}
	}
	
	print_lines:
	while(!ss.eof())
	{
		line = cast(string)ss.readLine();
		printf("%.*s\n", line);
		
		//if(std.string.ifind(line, "</html>") != -1)
		//	break;
		size_t iw;
		for(iw = 0; iw != line.length; iw++)
		{
			if(!icmp("</html>", line[iw .. line.length]))
				break print_lines;
		}
	}
	
	return 0;
}

Error msg:

F:\DLang\DTwo\dmd\samples\d>bud -O -release -clean htmlget.d
htmlget.d(74): Error: constructor std.socket.InternetAddress.this () is not call
able using argument types (uint,uint)
htmlget.d(74): Error: expected 1 arguments, not 2 for non-variadic function type
 InternetAddress(ushort port)
htmlget.d(74): Error: cannot implicitly convert expression (addr) of type uint t
o ushort
htmlget.d(83): Error: function expected before (), not __error of type int

F:\DLang\DTwo\dmd\samples\d>

Read from this I learnt that class InternetAddress have no ctr
this(string,ushort),nor this(uint,ushort),but it does when I read the source of
std.socket.So what is the problem?

Thank you so much for your help in advance!!

Regards,
Sam 
Sep 28 2009
parent Sam Hu <samhudotsamhu gmail.com> writes:
For the sample htmlget.d,after modification again,now it gets compiled,but when
it gets running,nothing show in the console:


/*
	HTMLget written by Christopher E. Miller
	This code is public domain.
	You may use it for any purpose.
	This code has no warranties and is provided 'as-is'.
*/


//debug = HTMLGET;


module htmlget;
import std.string, std.conv, std.stream;
import std.socket, std.socketstream;
import std.stdio;

int main(string[] args)
{
	uint addr;
	if(args.length < 2)
	{
		printf("Usage:\n   htmlget <web-page>\n");
		return 0;
	}
	string url = args[1];
	int i;
	
	//i = std.string.find(url, "://");
	i=std.string.indexOf(url,"://");
	if(i != -1)
	{
		if(icmp(url[0 .. i], "http"))
			throw new Exception("http:// expected");
	}
	


	if(i != -1) // Remove anchor ref.
		url = url[0 .. i];
	
	//i = std.string.find(url, '/');
	i=std.string.indexOf(url,'/');
	string domain;
	if(i == -1)
	{
		domain = url;
		url = "/";
	}
	else
	{
		domain = url[0 .. i];
		url = url[i .. url.length];
	}
	
	ushort/*uint*/ port;
	//i = std.string.find(domain, ':');
	i=std.string.indexOf(domain,':');
	
	if(i == -1)
	{
		port = 80; // Default HTTP port.
	}
	else
	{
		//port = std.conv.toUshort(domain[i + 1 .. domain.length]);
		port=std.conv.to!(ushort)(domain[i+1..domain.length]);
		domain = domain[0 .. i];
	}
	addr=InternetAddress.parse(domain);
	debug(HTMLGET)
		printf("Connecting to " ~ domain ~ " on port " ~ std.string.to!string(port) ~
"...\n");
	
	auto Socket sock = new TcpSocket(new
std.socket.InternetAddress(addr/*domain*/, port));
	Stream ss = new SocketStream(sock);
	
	debug(HTMLGET)
		printf("Connected!\nRequesting URL \"" ~ url ~ "\"...\n");
	
	if(port != 80)
	{
		char[] temp=cast(char[]) domain;
		temp=temp~cast(char[])":" ~cast(char[]) (to!string(port));
		domain=cast(string)temp;
		//domain = domain ~ ":" ~ std.string.to!string(port);
	}
	ss.writeString("GET " ~ url ~ " HTTP/1.1\r\n"
		"Host: " ~ domain ~ "\r\n"
		"\r\n");
	
	// Skip HTTP header.
	string line;
	for(;;)
	{
		line = cast(string)ss.readLine();
		if(!line.length)
			break;
		
		const string CONTENT_TYPE_NAME = "Content-Type: ";
		if(line.length > CONTENT_TYPE_NAME.length &&
			!icmp(CONTENT_TYPE_NAME, line[0 .. CONTENT_TYPE_NAME.length]))
		{
			string type;
			type = line[CONTENT_TYPE_NAME.length .. line.length];
			if(type.length <= 5 || icmp("text/", type[0 .. 5]))
				throw new Exception("URL is not text");
		}
	}
	
	print_lines:
	while(!ss.eof())
	{
		line = cast(string)ss.readLine();
		printf("%.*s\n", line);
		
		//if(std.string.ifind(line, "</html>") != -1)
		//	break;
		size_t iw;
		for(iw = 0; iw != line.length; iw++)
		{
			if(!icmp("</html>", line[iw .. line.length]))
				break print_lines;
		}
	}
	
	return 0;
}

Help would be appreciated.

Regards,
Sam
Sep 28 2009