Thread overview
another question about time()
Apr 26, 2006
Abby (J.P.)
Apr 26, 2006
Tydr Schnubbis
Apr 27, 2006
Abby (J.P.)
Apr 27, 2006
Abby (J.P.)
Apr 27, 2006
Derek Parnell
Apr 30, 2006
Bruno Medeiros
April 26, 2006
Hello, I'm trying to make a ping utility, I made a working ICMP request (I tested it with Ethereal, I get a reply from the server). But I wonder how much precise are the std.c.time.time() or the std.date.time(), because I always find a ping of 0ms (I know that it must be 1000 ticks per seconds, but I'm not sure, this really is).
Here is my code :


char[] host = "www.microsoft.com"
InternetHost targetHost;
targetHost.getHostByName(host);

InternetAddress targetAddress = new InternetAddress(targetHost.addrList[0], InternetAddress.PORT_ANY);

Socket pingingSocket = new Socket(AddressFamily.INET, SocketType.RAW, ProtocolType.ICMP);

//pingingSocket.connect(targetAddress);
//long start_time = getUTCtime();
int start_time;
std.c.time.time(&start_time);

pingingSocket.sendTo(PING_REQUEST, targetAddress);

char[] response;
pingingSocket.receive(response);

//long end_time = getUTCtime();
int end_time;
std.c.time.time(&end_time);

// char [] str_ping = std.string.toString((end_time - start_time));
char [] str_ping = std.string.toString((end_time - start_time)/2);
pingingSocket.close();
printf("ping : " ~ str_ping);

As you can see, I tried both std.c.time and std.date functions, but str_ping is always 0. Did I done something wrong ? Should I put the start_time before the resolving getHostByName() ?

--
Abby
April 26, 2006
Abby (J.P.) wrote:
> Hello, I'm trying to make a ping utility, I made a working ICMP request (I tested it with Ethereal, I get a reply from the server). But I wonder how much precise are the std.c.time.time() or the std.date.time(), because I always find a ping of 0ms (I know that it must be 1000 ticks per seconds, but I'm not sure, this really is).
> Here is my code :
> 
> 
> char[] host = "www.microsoft.com"
> InternetHost targetHost;
> targetHost.getHostByName(host);
> 
> InternetAddress targetAddress = new InternetAddress(targetHost.addrList[0], InternetAddress.PORT_ANY);
> 
> Socket pingingSocket = new Socket(AddressFamily.INET, SocketType.RAW, ProtocolType.ICMP);
> 
> //pingingSocket.connect(targetAddress);
> //long start_time = getUTCtime();
> int start_time;
> std.c.time.time(&start_time);
> 
> pingingSocket.sendTo(PING_REQUEST, targetAddress);
> 
> char[] response;
> pingingSocket.receive(response);
> 
> //long end_time = getUTCtime();
> int end_time;
> std.c.time.time(&end_time);
> 
> // char [] str_ping = std.string.toString((end_time - start_time));
> char [] str_ping = std.string.toString((end_time - start_time)/2);
> pingingSocket.close();
> printf("ping : " ~ str_ping);
> 
> As you can see, I tried both std.c.time and std.date functions, but str_ping is always 0. Did I done something wrong ? Should I put the start_time before the resolving getHostByName() ?
> 
> --
> Abby

I can't ping www.microsoft.com at all, did you try another address, like google.com?
April 27, 2006
On Wed, 26 Apr 2006 22:09:05 +0200, Abby (J.P.) wrote:

> Hello, I'm trying to make a ping utility, I made a working ICMP request
> (I tested it with Ethereal, I get a reply from the server). But I wonder
> how much precise are the std.c.time.time() or the std.date.time(),
> because I always find a ping of 0ms (I know that it must be 1000 ticks
> per seconds, but I'm not sure, this really is).
> Here is my code :
> 
> char[] host = "www.microsoft.com"
> InternetHost targetHost;
> targetHost.getHostByName(host);
> 
> InternetAddress targetAddress = new InternetAddress(targetHost.addrList[0], InternetAddress.PORT_ANY);
> 
> Socket pingingSocket = new Socket(AddressFamily.INET, SocketType.RAW, ProtocolType.ICMP);
> 
> //pingingSocket.connect(targetAddress);
> //long start_time = getUTCtime();
> int start_time;
> std.c.time.time(&start_time);
> 
> pingingSocket.sendTo(PING_REQUEST, targetAddress);
> 
> char[] response;
> pingingSocket.receive(response);
> 
> //long end_time = getUTCtime();
> int end_time;
> std.c.time.time(&end_time);
> 
> // char [] str_ping = std.string.toString((end_time - start_time));
> char [] str_ping = std.string.toString((end_time - start_time)/2);
> pingingSocket.close();
> printf("ping : " ~ str_ping);
> 
> As you can see, I tried both std.c.time and std.date functions, but str_ping is always 0. Did I done something wrong ? Should I put the start_time before the resolving getHostByName() ?

You might be better to use another undocumented module 'std.perf'.

For example ...

   import std.perf;
   . . .
   ProcessTimesCounter counter = new ProcessTimesCounter();
   counter.start();

   . . .  the stuff you want to time . . .

   counter.stop();
   writefln("Duration: %s microseconds", counter.microseconds);


-- 
Derek
(skype: derek.j.parnell)
Melbourne, Australia
"Down with mediocracy!"
27/04/2006 10:50:33 AM
April 27, 2006
Tydr Schnubbis wrote:
> Abby (J.P.) wrote:
>> Hello, I'm trying to make a ping utility, I made a working ICMP request (I tested it with Ethereal, I get a reply from the server). But I wonder how much precise are the std.c.time.time() or the std.date.time(), because I always find a ping of 0ms (I know that it must be 1000 ticks per seconds, but I'm not sure, this really is).
>> Here is my code :
>>
>>
>> char[] host = "www.microsoft.com"
>> InternetHost targetHost;
>> targetHost.getHostByName(host);
>>
>> InternetAddress targetAddress = new InternetAddress(targetHost.addrList[0], InternetAddress.PORT_ANY);
>>
>> Socket pingingSocket = new Socket(AddressFamily.INET, SocketType.RAW, ProtocolType.ICMP);
>>
>> //pingingSocket.connect(targetAddress);
>> //long start_time = getUTCtime();
>> int start_time;
>> std.c.time.time(&start_time);
>>
>> pingingSocket.sendTo(PING_REQUEST, targetAddress);
>>
>> char[] response;
>> pingingSocket.receive(response);
>>
>> //long end_time = getUTCtime();
>> int end_time;
>> std.c.time.time(&end_time);
>>
>> // char [] str_ping = std.string.toString((end_time - start_time));
>> char [] str_ping = std.string.toString((end_time - start_time)/2);
>> pingingSocket.close();
>> printf("ping : " ~ str_ping);
>>
>> As you can see, I tried both std.c.time and std.date functions, but str_ping is always 0. Did I done something wrong ? Should I put the start_time before the resolving getHostByName() ?
>>
>> -- 
>> Abby
> 
> I can't ping www.microsoft.com at all, did you try another address, like google.com?

yes, I tried few addresses (I thought microsoft.com would work also)
IP addresses on my LAN (with getHostByAddr) produce the same probleme.
But you're right, I should check the char[] response to see if the server has anwsered me !

I'm going to use std.perf as Dereck told me (I hope it will work !)

Thanks for your anwsers

--
Abby
April 27, 2006
Abby (J.P.) wrote:
> Tydr Schnubbis wrote:
>> Abby (J.P.) wrote:
>>> Hello, I'm trying to make a ping utility, I made a working ICMP request (I tested it with Ethereal, I get a reply from the server). But I wonder how much precise are the std.c.time.time() or the std.date.time(), because I always find a ping of 0ms (I know that it must be 1000 ticks per seconds, but I'm not sure, this really is).
>>> Here is my code :
>>>
>>>
>>> char[] host = "www.microsoft.com"
>>> InternetHost targetHost;
>>> targetHost.getHostByName(host);
>>>
>>> InternetAddress targetAddress = new InternetAddress(targetHost.addrList[0], InternetAddress.PORT_ANY);
>>>
>>> Socket pingingSocket = new Socket(AddressFamily.INET, SocketType.RAW, ProtocolType.ICMP);
>>>
>>> //pingingSocket.connect(targetAddress);
>>> //long start_time = getUTCtime();
>>> int start_time;
>>> std.c.time.time(&start_time);
>>>
>>> pingingSocket.sendTo(PING_REQUEST, targetAddress);
>>>
>>> char[] response;
>>> pingingSocket.receive(response);
>>>
>>> //long end_time = getUTCtime();
>>> int end_time;
>>> std.c.time.time(&end_time);
>>>
>>> // char [] str_ping = std.string.toString((end_time - start_time));
>>> char [] str_ping = std.string.toString((end_time - start_time)/2);
>>> pingingSocket.close();
>>> printf("ping : " ~ str_ping);
>>>
>>> As you can see, I tried both std.c.time and std.date functions, but str_ping is always 0. Did I done something wrong ? Should I put the start_time before the resolving getHostByName() ?
>>>
>>> -- 
>>> Abby
>>
>> I can't ping www.microsoft.com at all, did you try another address, like google.com?
> 
> yes, I tried few addresses (I thought microsoft.com would work also)
> IP addresses on my LAN (with getHostByAddr) produce the same probleme.
> But you're right, I should check the char[] response to see if the server has anwsered me !
> 
> I'm going to use std.perf as Dereck told me (I hope it will work !)
> 
> Thanks for your anwsers
> 
> -- 
> Abby
After testing the content of char[] response, it looks like the problem comes from
pingingSocket.receive(response)
The string is always null, and that might also be the cause of my bad timer. But I can see the resquest AND the reply fom the server in ethereal. Is there something special to do, when working with ICMP packets ?
I didn't use
connect(Address)
so my socket is not connected, maybe I should specify that it has to listen for incoming packets ?
April 30, 2006
Derek Parnell wrote:
> On Wed, 26 Apr 2006 22:09:05 +0200, Abby (J.P.) wrote:
> 
>> Hello, I'm trying to make a ping utility, I made a working ICMP request (I tested it with Ethereal, I get a reply from the server). But I wonder how much precise are the std.c.time.time() or the std.date.time(), because I always find a ping of 0ms (I know that it must be 1000 ticks per seconds, but I'm not sure, this really is).
>> Here is my code :
>>
>> char[] host = "www.microsoft.com"
>> InternetHost targetHost;
>> targetHost.getHostByName(host);
>>
>> InternetAddress targetAddress = new InternetAddress(targetHost.addrList[0], InternetAddress.PORT_ANY);
>>
>> Socket pingingSocket = new Socket(AddressFamily.INET, SocketType.RAW, ProtocolType.ICMP);
>>
>> //pingingSocket.connect(targetAddress);
>> //long start_time = getUTCtime();
>> int start_time;
>> std.c.time.time(&start_time);
>>
>> pingingSocket.sendTo(PING_REQUEST, targetAddress);
>>
>> char[] response;
>> pingingSocket.receive(response);
>>
>> //long end_time = getUTCtime();
>> int end_time;
>> std.c.time.time(&end_time);
>>
>> // char [] str_ping = std.string.toString((end_time - start_time));
>> char [] str_ping = std.string.toString((end_time - start_time)/2);
>> pingingSocket.close();
>> printf("ping : " ~ str_ping);
>>
>> As you can see, I tried both std.c.time and std.date functions, but str_ping is always 0. Did I done something wrong ? Should I put the start_time before the resolving getHostByName() ?
> 
> You might be better to use another undocumented module 'std.perf'.
> 
> For example ...
> 
>    import std.perf;
>    . . .
>    ProcessTimesCounter counter = new ProcessTimesCounter();
>    counter.start();
> 
>    . . .  the stuff you want to time . . .
> 
>    counter.stop();
>    writefln("Duration: %s microseconds", counter.microseconds);
> 
> 

Wouldn't clock() suffice ?

-- 
Bruno Medeiros - CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D