#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define WIN32_LEAN_AND_MEAN
#include <winsock.h>
#pragma comment(lib, "Wsock32.lib")
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
//#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)
#define ICMP_MIN (8 + 4) // minimum 8 byte icmp packet (just header + timestamp)
// IP header
typedef struct _tagX_iphdr
{
unsigned char h_len:4 // length of the header
unsigned char version:4 // Version of IP
unsigned char tos// Type of service
unsigned short total_len // total length of the packet
unsigned short ident // unique identifier
unsigned short frag_and_flags// flags
unsigned char ttl // ttl
unsigned char proto // protocol (TCP, UDP etc)
unsigned short checksum // IP checksum
unsigned int sourceIP
unsigned int destIP
}XIpHeader
// ICMP header
typedef struct _tagX_icmphdr
{
unsigned char i_type
unsigned char i_code
unsigned short i_cksum
unsigned short i_id
unsigned short i_seq
unsigned long i_timestamp
}XIcmpHeader
//puclic code
//网际校验和生产算法
//网际校验和是被校验数据16位值的反码和(ones-complement sum)
unsigned short in_cksum(unsigned short* addr, int len)
{
int nleft = len
int sum = 0
unsigned short* w = addr
unsigned short answer = 0
while(nleft >1) {
sum += *w++
nleft -= 2
}
if(nleft == 1) {
*(unsigned char*)(&answer) = *(unsigned char*)w
sum += answer
}
sum = (sum >>16) + (sum &0xffff)
sum += (sum >>16)
answer = ~sum
return (answer)
}
void fill_IcmpData(char *buf, int datasize)
{
if (buf)
{
char ch = 0
char* icmpdata = buf + sizeof(XIcmpHeader)
fprintf(stdout, "(IcmpData)\r\n")
for (int i = 0i <datasizei++)
{
ch = 'A' + i%('z' - 'A')
*(icmpdata + i) = ch
fprintf(stdout, "%c", ch)
}
fprintf(stdout, "\r\n")
}
}
void fill_IcmpHeader(char *buf, int datasize)
{
static unsigned short seq_no = 0
XIcmpHeader *icmp_hdr = (XIcmpHeader *)buf
if (icmp_hdr)
{
icmp_hdr->i_type = ICMP_ECHO
icmp_hdr->i_code = 0
icmp_hdr->i_cksum = 0
icmp_hdr->i_id = (unsigned short)GetCurrentProcessId()
icmp_hdr->i_seq = seq_no++
icmp_hdr->i_timestamp = (unsigned long)::GetTickCount()
icmp_hdr->i_cksum = in_cksum((unsigned short*)buf, sizeof(XIcmpHeader) + datasize)
fprintf(stdout, "(IcmpHeader)\r\n")
fprintf(stdout, "%02X%02X%04X\r\n", icmp_hdr->i_type, icmp_hdr->i_code, icmp_hdr->i_cksum)
fprintf(stdout, "%04X%04X\r\n", icmp_hdr->i_id, icmp_hdr->i_seq)
fprintf(stdout, "%08X\r\n", icmp_hdr->i_timestamp)
}
}
// decode
void decode_IpIcmp(char *buf, int size)
{
XIpHeader *ip_hdr = (XIpHeader *)buf
unsigned short iphdrlen
if (ip_hdr)
{
fprintf(stdout, "(IpHeader)\r\n")
fprintf(stdout, "%01X%01X%02X%04X\r\n", ip_hdr->version, ip_hdr->h_len, ip_hdr->tos, ip_hdr->total_len)
fprintf(stdout, "%04X%04X\r\n", ip_hdr->ident, ip_hdr->frag_and_flags)
fprintf(stdout, "%02X%02X%04X\r\n", ip_hdr->ttl, ip_hdr->proto, ip_hdr->checksum)
//iphdrlen = ip_hdr->h_len * 4// number of 32-bit words *4 = bytes
iphdrlen = ip_hdr->h_len <<2// number of 32-bit words *4 = bytes
fprintf(stdout, "(IcmpHeader)\r\n")
if (size <iphdrlen + ICMP_MIN)
{
fprintf(stdout, "Reply %d bytes Too few\r\n", size)
}
else
{
XIcmpHeader *icmp_hdr = (XIcmpHeader *)(buf + iphdrlen)
fprintf(stdout, "%02X%02X%04X\r\n", icmp_hdr->i_type, icmp_hdr->i_code, icmp_hdr->i_cksum)
fprintf(stdout, "%04X%04X\r\n", icmp_hdr->i_id, icmp_hdr->i_seq)
fprintf(stdout, "%08X\r\n", icmp_hdr->i_timestamp)
unsigned long timestamp = 0
timestamp = (unsigned long)::GetTickCount()
timestamp -= icmp_hdr->i_timestamp
struct sockaddr_in from
from.sin_addr.s_addr = ip_hdr->sourceIP
fprintf(stdout, "Reply %d bytes from: %s time<%d TTL=%d icmp_seq=%d\r\n",
size,
inet_ntoa(from.sin_addr),
timestamp,
ip_hdr->ttl,
icmp_hdr->i_seq
)
}
}
}
int main(int argc, char **argv)
{
int ret = 0
WSADATA ws
WSAStartup(0x0101,&ws)
int iIcmpDataSize = 0
struct sockaddr_in dest,from
unsigned int addr = 0
struct hostent *hp
char buffer[1024]
char recv_buffer[1024]
if(argc <2)
{
fprintf(stderr, "Usage: %s [host|ip] [datasize]\r\n", argv[0])
return 0
}
if (argc >2)
iIcmpDataSize = atoi(argv[2])
if (iIcmpDataSize <1 || iIcmpDataSize >1024)
iIcmpDataSize = 10
memset(&dest, 0, sizeof dest)
dest.sin_family = AF_INET
hp = gethostbyname(argv[1])
if (!hp)
addr = inet_addr(argv[1])
if ((!hp) &&(addr == INADDR_NONE))
{
fprintf(stderr,"Unable to resolve %s\r\n",argv[1])
return 0
}
if (hp != NULL)
memcpy(&(dest.sin_addr), hp->h_addr,hp->h_length)
else
dest.sin_addr.s_addr = addr
int sockfd
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
fprintf(stdout, "XPing...\r\n")
for (int i = 0i <3i++)
{
fprintf(stdout, "Echo...\r\n")
memset(buffer, 0, 1024)
fill_IcmpData(buffer, iIcmpDataSize)
fill_IcmpHeader(buffer, iIcmpDataSize)
XIcmpHeader *icmp_hdr = (XIcmpHeader *)buffer
int iSendSize = sendto(sockfd, buffer, sizeof(XIcmpHeader) + iIcmpDataSize, 0, (struct sockaddr*)&dest, sizeof(dest))
fprintf(stdout, "Reply...\r\n")
memset(&from, 0, sizeof from)
memset(recv_buffer, 0, 1024)
int fromlen = sizeof(from)
int iRecvSize = recvfrom(sockfd, recv_buffer, 1024, 0, (struct sockaddr*)&from, &fromlen)
if (iRecvSize >0)
decode_IpIcmp(recv_buffer, iRecvSize)
}
WSACleanup()
return ret
}
直接使用system函数调用ping即可int main(){system("ping www.baidu.com") system("ping fjla") system("ping www.hcnu.edu.cn") return 0}
C#:class Ping
{
const int SOCKET_ERROR = -1
const int ICMP_ECHO = 8
public static OnPingLog onpinglog=null
protected static PingLog plog=new PingLog()
public static void WirteLog(string s)
{
Ping.plog.writelog(s)
if(onpinglog!=null)
{
onpinglog(s)
}
}
public static UInt16 checksum(UInt16[] buffer,int size)
{
Int32 cksum = 0
int counter = 0
while (size>0)
{
UInt16 val = buffer[counter]
cksum += Convert.ToInt32(buffer[counter])
counter++
size--
}
cksum = (cksum >> 16)+(cksum & 0xffff)
cksum += (cksum >> 16)
return (UInt16)(~cksum)
}
public static Int32 Serialize( IcmpPacket packet,Byte[] Buffer,Int32 PacketSize,Int32 PingData)
{
Int32 cbReturn = 0
int Index = 0
Byte[] b_type = new Byte[1]
b_type[0] = (packet.Type)
Byte[] b_code = new Byte[1]
b_code[0] = (packet.SubCode)
Byte[] b_cksum = BitConverter.GetBytes(packet.CheckSum)
Byte[] b_id = BitConverter.GetBytes(packet.Identifier)
Byte[] b_seq = BitConverter.GetBytes(packet.SequenceNumber)
Array.Copy(b_type,0,Buffer,Index,b_type.Length)
Index += b_type.Length
Array.Copy(b_code,0,Buffer,Index,b_code.Length)
Index += b_code.Length
Array.Copy(b_cksum,0,Buffer,Index,b_cksum.Length)
Index += b_cksum.Length
Array.Copy(b_id,0,Buffer,Index,b_id.Length)
Index += b_id.Length
Array.Copy(b_seq,0,Buffer,Index,b_seq.Length)
Index += b_seq.Length
Array.Copy(packet.Data,0,Buffer,Index,PingData)
Index += PingData
if(Index != PacketSize)
{
cbReturn = -1
return cbReturn
}
cbReturn = Index
return cbReturn
}
public static void PingHost(string host)
{
IPHostEntry serverHE,fromHE
int nBytes = 0
int dwStart = 0
int dwStop = 0
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp)
try
{
//serverHE = Dns.GetHostByName(host)
serverHE = Dns.GetHostByAddress(host.Split(':')[0])
}
catch(Exception)
{
WirteLog("目标主机" + host + "不存在")
return
}
//测试端口
// int portNum = 0
// if(host.Split(':').Length >1)
// {
//portNum = Int32.Parse(host.Split(':')[1])
// }
// else
// {
//portNum = 13
// }
// string hostName = host.Split(':')[0]
// try
// {
//TcpClient client = new TcpClient(hostName, portNum)
//client.Close()
// }
// catch (Exception e)
// {
//WirteLog("错误:" + host + e.Message + "")
//socket.Close()
//return
// }
IPEndPoint ipepServer
if(host.Split(':').Length >1)
{
ipepServer = new IPEndPoint(serverHE.AddressList[0],Int32.Parse(host.Split(':')[1]))
}
else
{
ipepServer = new IPEndPoint(serverHE.AddressList[0],0)
}
EndPoint epServer = (ipepServer)
fromHE = Dns.GetHostByName(Dns.GetHostName())
IPEndPoint ipEndPointFrom
if(host.Split(':').Length == 1)
{
ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0],0)
}
else
{
ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0],Int32.Parse(host.Split(':')[1]))
}
EndPoint EndPointFrom = (ipEndPointFrom)
int PacketSize = 0
IcmpPacket packet = new IcmpPacket()
packet.Type = ICMP_ECHO
packet.SubCode = 0
packet.CheckSum = UInt16.Parse("0")
packet.Identifier = UInt16.Parse("45")
packet.SequenceNumber = UInt16.Parse("0")
int PingData = 32
packet.Data = new Byte[PingData]
for(int i=0i<PingDatai++)
{
packet.Data[i] = (byte)'#'
}
PacketSize = PingData + 8
Byte[] icmp_pkt_buffer = new Byte[PacketSize]
Int32 Index = 0
Index = Serialize(packet,icmp_pkt_buffer,PacketSize,PingData)
if(Index == -1)
{
WirteLog("错误(Error in Making Packet)")
return
}
Double double_length = Convert.ToDouble(Index)
Double dtemp = Math.Ceiling(double_length/2)
int cksum_buffer_length = Convert.ToInt32(dtemp)
UInt16[] cksum_buffer = new UInt16[cksum_buffer_length]
int icmp_header_buffer_index = 0
for(int i=0i<cksum_buffer_lengthi++)
{
cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index)
icmp_header_buffer_index += 2
}
UInt16 u_cksum = checksum(cksum_buffer,cksum_buffer_length)
packet.CheckSum = u_cksum
Byte[] sendbuf = new Byte[PacketSize]
Index = Serialize(packet,sendbuf,PacketSize,PingData)
if(Index == -1)
{
WirteLog("错误(Error in Making Packet)")
return
}
dwStart = System.Environment.TickCount
if((nBytes = socket.SendTo(sendbuf,PacketSize,0,epServer)) == SOCKET_ERROR)
{
WirteLog("错误(Socket Error can not Sending Packet)")
}
Byte[] ReceiveBuffer = new Byte[256]
nBytes = 0
bool recd = false
int timeout = 0
while(!recd)
{
nBytes = socket.ReceiveFrom(ReceiveBuffer,256,0,ref EndPointFrom)
if(nBytes == SOCKET_ERROR)
{
WirteLog("错误(远程主机没有响应)")
recd = true
break
}
else if(nBytes > 0)
{
dwStop = System.Environment.TickCount - dwStart
WirteLog("成功(Reply from"+epServer.ToString()+":bytes = "+ nBytes.ToString()+"time = "+dwStop +"ms)")
recd = true
break
}
timeout = System.Environment.TickCount - dwStart
if(timeout > 1000)
{
WirteLog("错误(超时)")
recd = true
}
}
socket.Close()
}
}
public class IcmpPacket
{
public IcmpPacket()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Byte Type
public Byte SubCode
public UInt16 CheckSum
public UInt16 Identifier
public UInt16 SequenceNumber
public Byte[] Data
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)