android ping -c 4 -i 1 -w 1000,Ping 的实现 ( c , 原始套接字,WinSock)

1

a1614188d1211952234dfca3e8a72e28.png

#include

<

cstdlib

>

2

a1614188d1211952234dfca3e8a72e28.png#include

<

iostream

>

3

a1614188d1211952234dfca3e8a72e28.png#include

<

windows.h

>

4

a1614188d1211952234dfca3e8a72e28.png

5

a1614188d1211952234dfca3e8a72e28.png

6

a1614188d1211952234dfca3e8a72e28.pngusing namespace std;

7

a1614188d1211952234dfca3e8a72e28.pngtypedef struct _iphdr

//

定义IP首部

8

a1614188d1211952234dfca3e8a72e28.png{

9

a1614188d1211952234dfca3e8a72e28.png    unsigned char h_verlen;

//

4位首部长度,4位IP版本号

10

a1614188d1211952234dfca3e8a72e28.png    unsigned char tos;

//

8位服务类型TOS

11

a1614188d1211952234dfca3e8a72e28.png    unsigned short total_len;

//

16位总长度(字节)

12

a1614188d1211952234dfca3e8a72e28.png    unsigned short ident;

//

16位标识

13

a1614188d1211952234dfca3e8a72e28.png    unsigned short frag_and_flags;

//

3位标志位

14

a1614188d1211952234dfca3e8a72e28.png    unsigned char ttl;

//

8位生存时间 TTL

15

a1614188d1211952234dfca3e8a72e28.png    unsigned char proto;

//

8位协议 (TCP, UDP 或其他)

16

a1614188d1211952234dfca3e8a72e28.png    unsigned short checksum;

//

16位IP首部校验和

17

a1614188d1211952234dfca3e8a72e28.png    unsigned

int

sourceIP;

//

32位源IP地址

18

a1614188d1211952234dfca3e8a72e28.png    unsigned

int

destIP;

//

32位目的IP地址

19

a1614188d1211952234dfca3e8a72e28.png}IP_HEADER;

20

a1614188d1211952234dfca3e8a72e28.png

21

a1614188d1211952234dfca3e8a72e28.pngtypedef struct _ihdr

22

a1614188d1211952234dfca3e8a72e28.png{

23

a1614188d1211952234dfca3e8a72e28.png

BYTE

i_type;

//

8位类型

24

a1614188d1211952234dfca3e8a72e28.png

BYTE

i_code;

//

8位代码

25

a1614188d1211952234dfca3e8a72e28.png    USHORT i_checksum;

//

16位校验和

26

a1614188d1211952234dfca3e8a72e28.png    USHORT i_id;

//

识别号(一般用进程号作为识别号)

27

a1614188d1211952234dfca3e8a72e28.png    USHORT i_sequence;

//

报文序列号

28

a1614188d1211952234dfca3e8a72e28.png    ULONG  i_timestamp;

//

时间戳

29

a1614188d1211952234dfca3e8a72e28.png}ICMP_HEADER,

*

PICMP_HEADER;

30

a1614188d1211952234dfca3e8a72e28.png

31

a1614188d1211952234dfca3e8a72e28.png

32

a1614188d1211952234dfca3e8a72e28.pngUSHORT checksum(USHORT

*

buff,

int

size)

33

a1614188d1211952234dfca3e8a72e28.png{

34

a1614188d1211952234dfca3e8a72e28.png    unsigned

long

cksum

=

0

;

35

a1614188d1211952234dfca3e8a72e28.png

while

(size

>

1

){

36

a1614188d1211952234dfca3e8a72e28.png          cksum

+=*

buff

++

;

37

a1614188d1211952234dfca3e8a72e28.png          size

-=

sizeof(USHORT);

38

a1614188d1211952234dfca3e8a72e28.png          }

39

a1614188d1211952234dfca3e8a72e28.png

if

(size){

40

a1614188d1211952234dfca3e8a72e28.png          cksum

+=*

(UCHAR

*

)(buff);

41

a1614188d1211952234dfca3e8a72e28.png          }

42

a1614188d1211952234dfca3e8a72e28.png    cksum

=

(cksum

>>

16

)

+

(cksum

&

0xffff);

43

a1614188d1211952234dfca3e8a72e28.png    cksum

+=

(cksum

>>

16

);

44

a1614188d1211952234dfca3e8a72e28.png    return (USHORT)(~cksum);

45

a1614188d1211952234dfca3e8a72e28.png

46

a1614188d1211952234dfca3e8a72e28.png}

47

a1614188d1211952234dfca3e8a72e28.png

48

a1614188d1211952234dfca3e8a72e28.png

49

a1614188d1211952234dfca3e8a72e28.png

50

a1614188d1211952234dfca3e8a72e28.png

int

main(

int

argc, char

*

argv[])

51

a1614188d1211952234dfca3e8a72e28.png{

52

a1614188d1211952234dfca3e8a72e28.png    char a;

53

a1614188d1211952234dfca3e8a72e28.png    WSADATA wsa;

54

a1614188d1211952234dfca3e8a72e28.png    sockaddr_in dest;

55

a1614188d1211952234dfca3e8a72e28.png

int

nRet;

56

a1614188d1211952234dfca3e8a72e28.png

int

nTimeout

=

1000

;

57

a1614188d1211952234dfca3e8a72e28.png

//

char        buff[sizeof(ICMP_HEADER)

+

32

];

58

a1614188d1211952234dfca3e8a72e28.png    char    buff[sizeof(ICMP_HEADER)];

59

a1614188d1211952234dfca3e8a72e28.png

int

ttl

=

32

;

60

a1614188d1211952234dfca3e8a72e28.png

if

(argc

<

2

){

61

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Usage : ping ip/host

"

<<

endl;

62

a1614188d1211952234dfca3e8a72e28.png          cin

>>

a;

63

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

64

a1614188d1211952234dfca3e8a72e28.png          }

65

a1614188d1211952234dfca3e8a72e28.png

if

(WSAStartup(MAKEWORD(

2

,

1

),

&

wsa)!

=

0

){

66

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Error when Initialize the socket

"

<<

endl;

67

a1614188d1211952234dfca3e8a72e28.png          system(

"

pause

"

);

68

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

69

a1614188d1211952234dfca3e8a72e28.png          }

70

a1614188d1211952234dfca3e8a72e28.png    SOCKET sRaw

=

socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);

71

a1614188d1211952234dfca3e8a72e28.png

if

(sRaw

==

INVALID_SOCKET){

72

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Error when create the rawsocket

"

<<

endl;

73

a1614188d1211952234dfca3e8a72e28.png          cin

>>

a;

74

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

75

a1614188d1211952234dfca3e8a72e28.png          }

76

a1614188d1211952234dfca3e8a72e28.png

/*

77

a1614188d1211952234dfca3e8a72e28.png    nRet

=

setsockopt(sRaw, IPPROTO_IP, IP_TTL, (

const

char

*

)

&

ttl,sizeof(ttl));

78

a1614188d1211952234dfca3e8a72e28.png

if

(nRet

==

SOCKET_ERROR){

79

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Error shen setsockopt ttl

"

<<

endl;

80

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Error Code          :

"

<<

WSAGetLastError()

<<

endl;

81

a1614188d1211952234dfca3e8a72e28.png          cin

>>

a;

82

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

83

a1614188d1211952234dfca3e8a72e28.png          }

84

a1614188d1211952234dfca3e8a72e28.png

*/

85

a1614188d1211952234dfca3e8a72e28.png    nRet

=

setsockopt(sRaw,SOL_SOCKET,SO_RCVTIMEO,(char

*

)

&

nTimeout,sizeof(nTimeout));

86

a1614188d1211952234dfca3e8a72e28.png

87

a1614188d1211952234dfca3e8a72e28.png

if

(nRet

==

SOCKET_ERROR){

88

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Error when setsockopt sendtimeout

"

<<

endl;

89

a1614188d1211952234dfca3e8a72e28.png          std::cout

<<

"

Error Code          :

"

<<

WSAGetLastError()

<<

endl;

90

a1614188d1211952234dfca3e8a72e28.png          cin

>>

a;

91

a1614188d1211952234dfca3e8a72e28.png          WSACleanup();

92

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

93

a1614188d1211952234dfca3e8a72e28.png          }

94

a1614188d1211952234dfca3e8a72e28.png    dest.sin_addr.s_addr

=

inet_addr(argv[

1

]);

95

a1614188d1211952234dfca3e8a72e28.png

//

dest.sin_port

=

htons(

0

);

96

a1614188d1211952234dfca3e8a72e28.png    dest.sin_family

=

AF_INET;

97

a1614188d1211952234dfca3e8a72e28.png

98

a1614188d1211952234dfca3e8a72e28.png

99

a1614188d1211952234dfca3e8a72e28.png

100

a1614188d1211952234dfca3e8a72e28.png    PICMP_HEADER picmp

=

(PICMP_HEADER) buff;

101

a1614188d1211952234dfca3e8a72e28.png    picmp

->

i_type

=

8

;

102

a1614188d1211952234dfca3e8a72e28.png

//

picmp

->

i_type

=

ICMP_ECHO;

103

a1614188d1211952234dfca3e8a72e28.png    picmp

->

i_code

=

0

;

104

a1614188d1211952234dfca3e8a72e28.png    picmp

->

i_id

=

(USHORT)GetCurrentProcessId();

105

a1614188d1211952234dfca3e8a72e28.png

106

a1614188d1211952234dfca3e8a72e28.png    picmp

->

i_sequence

=

0

;

107

a1614188d1211952234dfca3e8a72e28.png

//

memset(

&

buff[sizeof(ICMP_HEADER)],

'

E',32);

108

a1614188d1211952234dfca3e8a72e28.png

USHORT nSeq

=

0

;

109

a1614188d1211952234dfca3e8a72e28.png    char   recvbuff[

1024

];

110

a1614188d1211952234dfca3e8a72e28.png    sockaddr_in from;

111

a1614188d1211952234dfca3e8a72e28.png

int

nLen

=

sizeof(from);

112

a1614188d1211952234dfca3e8a72e28.png

while

(

1

){

113

a1614188d1211952234dfca3e8a72e28.png          static

int

nCount;

114

a1614188d1211952234dfca3e8a72e28.png

int

nRet;

115

a1614188d1211952234dfca3e8a72e28.png

116

a1614188d1211952234dfca3e8a72e28.png          picmp

->

i_checksum

=

0

;

117

a1614188d1211952234dfca3e8a72e28.png          picmp

->

i_sequence

=

nSeq

++

;

118

a1614188d1211952234dfca3e8a72e28.png          picmp

->

i_timestamp

=

GetTickCount();

119

a1614188d1211952234dfca3e8a72e28.png          picmp

->

i_checksum

=

checksum((USHORT

*

)buff,sizeof(buff));

120

a1614188d1211952234dfca3e8a72e28.png

121

a1614188d1211952234dfca3e8a72e28.png

if

(

++

nCount

>

4

)

122

a1614188d1211952234dfca3e8a72e28.png                 break;

123

a1614188d1211952234dfca3e8a72e28.png

//

nRet

=

sendto(sRaw,buff,sizeof(ICMP_HEADER)

+

32

,

0

,(SOCKADDR

*

)

&

dest,sizeof(dest));

124

a1614188d1211952234dfca3e8a72e28.png          nRet

=

sendto(sRaw,buff,sizeof(buff),

0

,(SOCKADDR

*

)

&

dest,sizeof(dest));

125

a1614188d1211952234dfca3e8a72e28.png

if

(nRet

==

SOCKET_ERROR){

126

a1614188d1211952234dfca3e8a72e28.png                 std::cout

<<

"

Error when sendto

"

<<

endl;

127

a1614188d1211952234dfca3e8a72e28.png                 cin

>>

a;

128

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

129

a1614188d1211952234dfca3e8a72e28.png                 }

130

a1614188d1211952234dfca3e8a72e28.png          nRet

=

recvfrom(sRaw,recvbuff,

1024

,

0

,(sockaddr

*

)

&

from,

&

nLen);

131

a1614188d1211952234dfca3e8a72e28.png

if

(nRet

==

SOCKET_ERROR){

132

a1614188d1211952234dfca3e8a72e28.png

if

(WSAGetLastError()!

=

WSAETIMEDOUT){

133

a1614188d1211952234dfca3e8a72e28.png

134

a1614188d1211952234dfca3e8a72e28.png                        std::cout

<<

"

Error when recvfrom ,Error Code:

"

<<

WSAGetLastError()

<<

endl;

135

a1614188d1211952234dfca3e8a72e28.png                        cin

>>

a;

136

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

137

a1614188d1211952234dfca3e8a72e28.png                 }

else

138

a1614188d1211952234dfca3e8a72e28.png                 {

139

a1614188d1211952234dfca3e8a72e28.png                        std::cout

<<

"

Recv timeout

"

<<

endl;

140

a1614188d1211952234dfca3e8a72e28.png                        continue;

141

a1614188d1211952234dfca3e8a72e28.png                        }

142

a1614188d1211952234dfca3e8a72e28.png          }

143

a1614188d1211952234dfca3e8a72e28.png

int

nTick

=

GetTickCount();

144

a1614188d1211952234dfca3e8a72e28.png

if

(nRet

<

sizeof(IP_HEADER)

+

sizeof(ICMP_HEADER)){

145

a1614188d1211952234dfca3e8a72e28.png                 std::cout

<<

"

recv too few bytes from :

"

<<

inet_ntoa(from.sin_addr);

146

a1614188d1211952234dfca3e8a72e28.png                 }

147

a1614188d1211952234dfca3e8a72e28.png          ICMP_HEADER

*

pic

=

(ICMP_HEADER

*

)(recvbuff

+

sizeof(IP_HEADER));

148

a1614188d1211952234dfca3e8a72e28.png

if

(pic

->

i_type!

=

0

){

149

a1614188d1211952234dfca3e8a72e28.png                 std::cout

<<

"

nonecho type ,recved type is :

"

<<

pic

->

i_type

<<

endl;

150

a1614188d1211952234dfca3e8a72e28.png                 cin

>>

a;

151

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

152

a1614188d1211952234dfca3e8a72e28.png                 }

153

a1614188d1211952234dfca3e8a72e28.png

if

(pic

->

i_id!

=

GetCurrentProcessId()){

154

a1614188d1211952234dfca3e8a72e28.png                 std::cout

<<

"

someone else's data

"

<<

endl;

155

a1614188d1211952234dfca3e8a72e28.png                 cin

>>

a;

156

a1614188d1211952234dfca3e8a72e28.png

exit

(

0

);

157

a1614188d1211952234dfca3e8a72e28.png                 }

158

a1614188d1211952234dfca3e8a72e28.png          printf(

"

%d bytes from %s:

"

,nRet,inet_ntoa(from.sin_addr));

159

a1614188d1211952234dfca3e8a72e28.png          printf(

"

icmp_seq = %d.

"

,pic

->

i_sequence);

160

a1614188d1211952234dfca3e8a72e28.png          printf(

"

time : %d ms \n

"

,nTick

-

pic

->

i_timestamp);

161

a1614188d1211952234dfca3e8a72e28.png          Sleep(

1000

);

162

a1614188d1211952234dfca3e8a72e28.png          }

163

a1614188d1211952234dfca3e8a72e28.png

164

a1614188d1211952234dfca3e8a72e28.png

165

a1614188d1211952234dfca3e8a72e28.png

166

a1614188d1211952234dfca3e8a72e28.png

167

a1614188d1211952234dfca3e8a72e28.png    WSACleanup();

168

a1614188d1211952234dfca3e8a72e28.png    system(

"

PAUSE

"

);

169

a1614188d1211952234dfca3e8a72e28.png    return EXIT_SUCCESS;

170

a1614188d1211952234dfca3e8a72e28.png}

171

a1614188d1211952234dfca3e8a72e28.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值