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 ); 
。。