代码编程——ping命令流程(图)

代码编程——ping命令流程(图),第1张

不是我写的,找的。

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11169145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存