timeval.tv_sec > 0 的时候功能正常
当 timeval.tv_sec := 0; 的时候
timeval.tv_usec 不论是多少,ping所有ip全部显示超时。很奇怪,在网络上看见很多人
timeval.tv_sec := 0;
timeval.tv_usec :=500
为什么我的不正常??。。
rawsock := socket( AF_INET, SOCK_RAW, IPPROTO_ICMP );
if rawsock = INVALID_Socket then
begin
ErrMsg( ’socket failed.’);
exit;
end;
pIcmpHdr := AllocMem( MAX_PACKET_SIZE );
pRecvBuf := AllocMem( MAX_PACKET_SIZE );
DataSize := sizeof(YICMPHeader);
//填充ICMP头
FillICMPData( pIcmpHdr, MAX_PACKET_SIZE );
//计算校验和
pIcmpHdr^.u16chksum := 0;
pIcmpHdr^.u16chksum := CheckSum( PU16(pIcmpHdr), DataSize );
tick := GetTickCount();
FillChar( DestAdr, sizeof(DestAdr), 0 );
DestAdr.sin_family := AF_INET;
DestAdr.sin_addr.S_addr := inet_addr( PChar(Edit1.Text) );
//如果edit1.text不是IP地址,而是域名
if DestAdr.sin_addr.S_addr = INADDR_NONE then
begin
pHost := gethostbyname( PChar(Edit1.Text) );
if pHost <> nil then
begin
move( pHost^.h_addr^^, DestAdr.sin_addr, pHost^.h_length );
DestAdr.sin_family := pHost^.h_addrtype;
end else
begin
ListBox1.Items.Add( ’解析域名: ’ + Edit1.Text + ’出错。’ );
closesocket(rawsock);
FreeMem( picmphdr );
FreeMem( precvbuf );
exit;
end;
end;
ListBox1.Items.Add( ’Ping ’ + Edit1.Text + ’......’ );
Listbox1.Update;
//发送ICMP包
ret := sendto( rawsock, pIcmpHdr^, DataSize, 0, DestAdr, sizeof(DestAdr) );
if ret = socket_error then
begin
ErrMsg( ’sendto failed.’ );
closesocket( rawsock );
FreeMem( pIcmpHdr );
FreeMem( pRecvBuf );
exit;
end;
FD_ZERO( fd_read );
FD_SET( rawsock, fd_read );
timeval.tv_sec := 3;
timeval.tv_usec := 0; //接收ICMP回复包
if select( 0, @fd_read, nil, nil, @timeval ) > 0 then
begin
if FD_ISSET( rawsock, fd_read ) then
begin
FillChar( FromAdr, sizeof(FromAdr), 0 );
FromAdr.sin_family := AF_INET;
FromLen := sizeof(FromAdr );
recvfrom( rawsock, pRecvBuf^, MAX_PACKET_SIZE, 0, FromAdr, FromLen );
ListBox1.Items.Add( DecodeIcmpReply( pRecvBuf, tick ) );
end;
end else
begin
ListBox1.Items.Add( ’超时。’ );
end;
closesocket(rawsock);
FreeMem( pIcmpHdr );
FreeMem( pRecvBuf );
。。
当 timeval.tv_sec := 0; 的时候
timeval.tv_usec 不论是多少,ping所有ip全部显示超时。很奇怪,在网络上看见很多人
timeval.tv_sec := 0;
timeval.tv_usec :=500
为什么我的不正常??。。
rawsock := socket( AF_INET, SOCK_RAW, IPPROTO_ICMP );
if rawsock = INVALID_Socket then
begin
ErrMsg( ’socket failed.’);
exit;
end;
pIcmpHdr := AllocMem( MAX_PACKET_SIZE );
pRecvBuf := AllocMem( MAX_PACKET_SIZE );
DataSize := sizeof(YICMPHeader);
//填充ICMP头
FillICMPData( pIcmpHdr, MAX_PACKET_SIZE );
//计算校验和
pIcmpHdr^.u16chksum := 0;
pIcmpHdr^.u16chksum := CheckSum( PU16(pIcmpHdr), DataSize );
tick := GetTickCount();
FillChar( DestAdr, sizeof(DestAdr), 0 );
DestAdr.sin_family := AF_INET;
DestAdr.sin_addr.S_addr := inet_addr( PChar(Edit1.Text) );
//如果edit1.text不是IP地址,而是域名
if DestAdr.sin_addr.S_addr = INADDR_NONE then
begin
pHost := gethostbyname( PChar(Edit1.Text) );
if pHost <> nil then
begin
move( pHost^.h_addr^^, DestAdr.sin_addr, pHost^.h_length );
DestAdr.sin_family := pHost^.h_addrtype;
end else
begin
ListBox1.Items.Add( ’解析域名: ’ + Edit1.Text + ’出错。’ );
closesocket(rawsock);
FreeMem( picmphdr );
FreeMem( precvbuf );
exit;
end;
end;
ListBox1.Items.Add( ’Ping ’ + Edit1.Text + ’......’ );
Listbox1.Update;
//发送ICMP包
ret := sendto( rawsock, pIcmpHdr^, DataSize, 0, DestAdr, sizeof(DestAdr) );
if ret = socket_error then
begin
ErrMsg( ’sendto failed.’ );
closesocket( rawsock );
FreeMem( pIcmpHdr );
FreeMem( pRecvBuf );
exit;
end;
FD_ZERO( fd_read );
FD_SET( rawsock, fd_read );
timeval.tv_sec := 3;
timeval.tv_usec := 0; //接收ICMP回复包
if select( 0, @fd_read, nil, nil, @timeval ) > 0 then
begin
if FD_ISSET( rawsock, fd_read ) then
begin
FillChar( FromAdr, sizeof(FromAdr), 0 );
FromAdr.sin_family := AF_INET;
FromLen := sizeof(FromAdr );
recvfrom( rawsock, pRecvBuf^, MAX_PACKET_SIZE, 0, FromAdr, FromLen );
ListBox1.Items.Add( DecodeIcmpReply( pRecvBuf, tick ) );
end;
end else
begin
ListBox1.Items.Add( ’超时。’ );
end;
closesocket(rawsock);
FreeMem( pIcmpHdr );
FreeMem( pRecvBuf );
。。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货