/* mask.d written by, Sohail Qayum Malik. I don't use D, it is good language. Some day in the near future I'll find some time to seriously do some good learning of this language */ import std.c.time; import std.c.stdio; import std.socket; int main(char[][] args){ AddressFamily af; SocketType st; ProtocolType pt; SocketFlags sf; int a; int ticksOne = 0; int ticksTwo = 0; if(args.length != 2){ printf("%s \n", &(args[0][0])); return 0; } InternetAddress toObj = new InternetAddress(args[1], InternetAddress.PORT_ANY); Address fromObj = new InternetAddress(InternetAddress.ADDR_ANY, InternetAddress.PORT_ANY); char[512] outBuf; char[512] inBuf; /* ICMP header Big-Endian is used to store multibyte numbers, Where the bits in a byte follow Little-Endian. */ outBuf[0] = 0x11; //type outBuf[1] = 0x00; //code outBuf[2] = 0xEE; //checksum high byte outBuf[3] = 0xFd; //checksum low byte outBuf[4] = 0x00; //identifier high byte outBuf[5] = 0x01; //identifier low byte outBuf[6] = 0x00; //sequence number high byte outBuf[7] = 0x01; //sequence number low byte Socket socketObj = new Socket(af.INET, st.RAW, pt.ICMP); socketObj.blocking = true; socketObj.sendTo(outBuf, toObj); ticksOne = clock(); printf("pinged....\n\n"); socketObj.receiveFrom(inBuf, fromObj ); ticksTwo = clock(); char[] ip = (cast(InternetAddress)fromObj).toAddrString(); printf("echo from %s:\n", &(ip[0]) ); printf("IP header....\n"); printf("Version and HeaderLegth = %.2xh ", inBuf[0]); printf("TOS = %.2xh ", inBuf[1]); printf("Total length = %.2x%.2xh ", inBuf[2], inBuf[3]); printf("Identifier = %.2x%.2xh ", inBuf[4], inBuf[5]); printf("Flag and SequenceNumber = %.2x%.2x ", inBuf[6], inBuf[7]); printf("TTL = %.2x ", inBuf[8]); printf("Protocol Type = %.2x ", inBuf[9]); printf("Checksum = %.2x%.2x ", inBuf[10], inBuf[11]); printf("SourceIP = %.2d.%.2d.%.2d.%.2d ",inBuf[12], inBuf[13], inBuf[14],inBuf[15]); printf("DestinationIP = %.2d.%.2d.%.2d.%.2d\n",inBuf[16], inBuf[17], inBuf[18],inBuf[19]); printf("ICMP payload....\n"); printf("Type = %.2xh ", inBuf[20]); printf("Code = %.2xh ", inBuf[21]); printf("Checksum = %.2x%.2xh ", inBuf[22], inBuf[23]); printf("Identifier = %.2x%.2xh ", inBuf[24], inBuf[25]); printf("Sequence Number=%.2x%.2xh\n", inBuf[26], inBuf[27]); printf("mask = %d.%d.%d.%d\n", inBuf[28], inBuf[29], inBuf[30], inBuf[31]); printf("message dump:\n"); for(a=0; a< ((inBuf[2] * 256) + inBuf[3]) - 32;a++) printf("%.2x ",inBuf[32 + a]); printf("\nTime taken(in mili-seconds) = %d", (ticksTwo - ticksOne) / CLK_TCK); return 0; }