資源簡介
這是一個用C語言寫的簡單的ping 程序,基本實現了ping程序的功能,程序結構簡潔,各個模塊都有說明,我想應該很容易明白,希望對大家有點幫助。開發環境是VC++6.0~~
代碼片段和文件信息
//?ping.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“stdafx.h“
#include
#include
#include
#include
#include
#pragma?comment(lib“WS2_32“)
typedef?struct?IPHeader?{
??UCHAR??iph_verlen;??//?Version?and?length?
??UCHAR??iph_tos;??//?Type?of?service?
??USHORT??iph_length;??//?Total?datagram?length?
??USHORT??iph_id;??//?Identification?
??USHORT??iph_offset;??//?Flags?fragment?offset?
??UCHAR??iph_ttl;??//?Time?to?live?
??UCHAR??iph_protocol;??//?Protocol?
??USHORT??iph_xsum;??//?Header?checksum?
??ULONG??iph_src;??//?Source?address?
??ULONG??iph_dest;??//?Destination?address?
}?IPHeader;?
USHORT?checksum(USHORT?*buffint?size)
{
unsigned?long?cksum?=?0;
//將數據以字單位累加到cksum?中
while(size?>?1)
{
cksum?+=?*buff++;
size?-=?sizeof(USHORT);
}
//如果為奇數,將最后一個字節擴展為雙字,再累加到cksum中
if(size)
{
cksum?+=?*(UCHAR*)?buff;
}
//將cksum的高16位和低16位相加,去反后得到校驗和
????cksum?=?(cksum?>>?16)+(cksum?&?0xffff);
cksum?+=?(cksum?>>?16);
return?(USHORT)(~cksum);
}
//定義ICMP頭的數據結構
typedef?struct?icmp_hdr
{
unsigned?char?icmp_type;??//消息類型
unsigned?char?inmp_code;??//代碼
unsigned?short?icmp_checksum;?//校驗和
//回顯頭
unsigned?short?icmp_id;??//標志請求的ID號
unsigned?short?icmp_sequence;?//序列號
unsigned?long?icmp_timestamp;?//時間戳
}?ICMP_HDR*PICMP_HDR;
int?main()
{
printf(“please?input?IP?address:\n“);
char?szDestIp[20];
????scanf(“%s“szDestIp);
// SOCKET?sRaw?=?::socket(PF_INETSOCK_RAWIPPROTO_IP);
???
WSADATA?wsaData;
if(WSAStartup(MAKEWORD(22)&wsaData)!=0)
{
printf(“啟動失敗!\n“);
return?0;
}
//創建原始套接字
SOCKET?sRaw?=?WSASocket(AF_INET?SOCK_RAW?IPPROTO_ICMP?NULL?0WSA_FLAG_OVERLAPPED);
//設置接收超時
int?timeout=2000; ?
????if(setsockopt(sRaw?SOL_SOCKET?SO_RCVTIMEO?(char*)&timeout?sizeof(timeout))==?SOCKET_ERROR)?
????{
????????printf(“Setting?Socket?Wrong“);
????????return?0;
????}
//設置目的地址
SOCKADDR_IN?dest;
dest.sin_family?=?AF_INET;
dest.sin_port?=?htons(0);
if(INADDR_NONE==(dest.sin_addr.S_un.S_addr?=?inet_addr(szDestIp)))
{
printf(“ip?address?wrong“);
}
//創建一個?ICMP?封包
char?buff[sizeof(ICMP_HDR)+32];
ICMP_HDR*pIcmp?=?(ICMP_HDR*)buff;
pIcmp->icmp_type?=?8;
pIcmp->inmp_code?=?0;
pIcmp->icmp_id?=?(USHORT)::GetCurrentProcessId();
pIcmp->icmp_checksum?=?0;
pIcmp->icmp_sequence?=?0;
memset(&buff[sizeof(ICMP_HDR)]‘E‘32);?//填充數據部分,可以任意??void?*memset(?void?*dest?int?c?size_t?count?);Sets?buffers?to?a?specified?character.
//開始發送和接收ICMP封包
????USHORT?nSeq?=?0;
char?recvBuf[1024];
SOCKADDR_IN?from;?//一個結構體
????int?nLen?=?sizeof(from);
while?(TRUE)
{
static?int?nCount?=?0;
int?nRet;
nCount++;
if(nCount?==?4)?break;
pIcmp->icmp_checksum?=?0;
pIcmp->icmp_timestamp?=?::GetTickCount();
pIcmp->icmp_sequence??=?nSeq++;
pIcmp->icmp_checksum?=?checksum((USHORT*)buffsizeof(ICMP_HDR)+32);
nRet?=?::sendto?(sRawbuffsizeof(ICMP_HD
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????731??2008-12-08?16:43??ping\ping.h
?????文件????????667??2008-12-26?18:24??ping\StdAfx.h
?????文件???????1196??2008-12-26?18:24??ping\ReadMe.txt
?????文件???????4512??2008-12-26?18:24??ping\ping.dsp
?????文件????????533??2008-12-26?18:24??ping\ping.dsw
?????文件??????58368??2009-01-02?17:20??ping\ping.ncb
?????文件???????1308??2008-12-29?13:32??ping\ping.plg
?????文件????????311??2008-12-26?18:40??ping\StdAfx.cpp
?????文件???????3676??2008-12-29?13:32??ping\ping.cpp
?????文件??????53760??2009-01-02?17:20??ping\ping.opt
?????文件?????164864??2009-01-02?16:38??ping\Debug\vc60.idb
?????文件?????187100??2008-12-26?18:40??ping\Debug\ping.pch
?????文件?????258048??2008-12-29?13:32??ping\Debug\vc60.pdb
?????文件?????167984??2008-12-29?13:32??ping\Debug\ping.exe
?????文件?????443392??2008-12-29?13:32??ping\Debug\ping.pdb
?????文件??????11439??2008-12-26?18:40??ping\Debug\StdAfx.obj
?????文件?????198044??2008-12-29?13:32??ping\Debug\ping.ilk
?????文件??????50290??2008-12-29?13:32??ping\Debug\ping.obj
?????目錄??????????0??2009-01-03?15:37??ping\Debug
?????目錄??????????0??2009-01-03?15:37??ping
-----------?---------??----------?-----??----
??????????????1606223????????????????????20
- 上一篇:lcd12684顯示程序
- 下一篇:DICOM圖像讀取以及窗寬,窗位調整
評論
共有 條評論