Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
April 26, 2006 another question about time() | ||||
---|---|---|---|---|
| ||||
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 Re: another question about time() | ||||
---|---|---|---|---|
| ||||
Posted in reply to Abby (J.P.) | 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 Re: another question about time() | ||||
---|---|---|---|---|
| ||||
Posted in reply to Abby (J.P.) | 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 Re: another question about time() | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tydr Schnubbis | 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 Re: another question about time() | ||||
---|---|---|---|---|
| ||||
Posted in reply to Abby (J.P.) | 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 Re: another question about time() | ||||
---|---|---|---|---|
| ||||
Posted in reply to Derek Parnell | 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 |
Copyright © 1999-2021 by the D Language Foundation