<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[icmp]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream.h&gt;

#include &quot;icmp.h&quot;

using namespace std;

#define ICMP_ECHOREPLY                 0
#define ICMP_UNREACHABLE               3
#define ICMP_ECHO                      8

// 0 = Netz nicht erreichbar
#define ICMP_CODE_NETWORK_UNREACHABLE  0
// 1 = Rechner nicht erreichbar
#define ICMP_CODE_HOST_UNREACHABLE     1

// Minimalgrösse 8 Byte
#define ICMP_MIN            8

#define STATUS_FAILED       0xFFFF
#define DEF_PACKET_SIZE     32
#define MAX_PACKET          65000
</code></pre>
<pre><code class="language-cpp">int ICMP_::echo_ex(string ip, unsigned short cur_proc_addr)
{
  SOCKET sockRaw;
  SOCKADDR_IN addrDest;
  SOCKADDR_IN addrFrom;
  int addrFromLen = sizeof(addrFrom);
  HOSTENT* ptrHostent;
  unsigned long datasize;
  int RecvTimeout = 1000;
  char *dest_ip;
  char *icmp_data;
  char *recvbuf;
  unsigned int addr=0;
  unsigned short seq_no = 0;
  int BytesReceived;
  int BytesSent;
  long rc;
  unsigned ping_anzahl=0;

  sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  if (sockRaw == INVALID_SOCKET)
  {
    return 1;
  }
  rc = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&amp;RecvTimeout, sizeof(RecvTimeout));
  if(rc == SOCKET_ERROR)
  {
    return 1;
  }

  // Ip Adresse in ptrHostent geben
  ptrHostent = gethostbyname(ip.c_str());

  if ((!ptrHostent)  &amp;&amp; (addr == INADDR_NONE) )
  {
    return 1;
  }
  if (ptrHostent != NULL)
  {
    memcpy(&amp;(addrDest.sin_addr),ptrHostent-&gt;h_addr, ptrHostent-&gt;h_length);
  }
  else
  {
    addrDest.sin_addr.s_addr = addr;
  }
  if (ptrHostent)
  {
    addrDest.sin_family = ptrHostent-&gt;h_addrtype;
  }
  else
  {
    addrDest.sin_family = AF_INET;
  }

  // Konvertiert eine Netzwerk Adresse (SOCKADDR_IN) in einen String im Punkt Format (x.x.x.x)
  dest_ip = inet_ntoa(addrDest.sin_addr);

  // Gröss des Datenpaketes
  datasize = 32;

  if (datasize == 0)
  {
     datasize = DEF_PACKET_SIZE;
  }

  if (datasize &gt; MAX_PACKET)
  {
     datasize = DEF_PACKET_SIZE;
  }

  datasize += sizeof(ICMP_HEADER);

  icmp_data = (char*)malloc(MAX_PACKET);
  recvbuf = (char*)malloc(MAX_PACKET+sizeof(IP_HEADER)+sizeof(ICMP_HEADER));

  if (!icmp_data || !recvbuf)
  {
    return 1;
  }
  ostringstream os;
  os &lt;&lt; &quot;die prozess id: &quot; &lt;&lt; cur_proc_addr;
 // MessageBox(0, os.str().c_str(), &quot;PID&quot;, MB_OK);
  FillIcmpData(icmp_data, datasize, cur_proc_addr);

    ((ICMP_HEADER*)icmp_data)-&gt;i_cksum = 0;
    ((ICMP_HEADER*)icmp_data)-&gt;timestamp = GetTickCount();

    ((ICMP_HEADER*)icmp_data)-&gt;i_seq = seq_no++;
    ((ICMP_HEADER*)icmp_data)-&gt;i_cksum = checksum((unsigned short*)icmp_data, datasize);

    BytesSent = sendto(sockRaw,icmp_data,datasize,0,(SOCKADDR*)&amp;addrDest, sizeof(addrDest));

    if (BytesSent == SOCKET_ERROR)
    {
      if (WSAGetLastError() == WSAETIMEDOUT)
      {
      }
      return 1;
    }
    if (BytesSent &lt; datasize )
    {
   }
    BytesReceived = recvfrom(sockRaw,recvbuf,MAX_PACKET+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),0,(SOCKADDR*)&amp;addrFrom, &amp;addrFromLen);

   if (BytesReceived == SOCKET_ERROR)
    {
      if (WSAGetLastError() == WSAETIMEDOUT)
      {
      }

      return 1;
    }    
  closesocket(sockRaw);
  return 0;
}
</code></pre>
<pre><code class="language-cpp">void ICMP_::FillIcmpData(char *icmp_data, int datasize, unsigned short id)
{
  ICMP_HEADER *icmp_hdr;
  char *datapart;

  icmp_hdr = (ICMP_HEADER*)icmp_data;

  icmp_hdr-&gt;i_type = ICMP_ECHO;
  icmp_hdr-&gt;i_code = 0;
  icmp_hdr-&gt;i_id = id;
  icmp_hdr-&gt;i_cksum = 0;
  icmp_hdr-&gt;i_seq = 0;

  datapart = icmp_data + sizeof(ICMP_HEADER);
  // Den Buffer mit etwas füllen
  memset(datapart,'C', datasize - sizeof(ICMP_HEADER));
}

unsigned short ICMP_::checksum(unsigned short *buffer, int size)
{
  unsigned long cksum=0;
  while(size &gt;1)
  {
    cksum+=*buffer++;
    size -=sizeof(unsigned short);
  }

  if(size)
  {
    cksum += *(unsigned char*)buffer;
  }

  cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
  cksum += (cksum &gt;&gt;16);
  return (unsigned short)(~cksum);
}

void ICMP_::DecodeResponse(char *buf,int bytes, SOCKADDR_IN *from, unsigned short id)
{
  IP_HEADER   *IpHeader;
  ICMP_HEADER *IcmpHeader;
  unsigned short IpHeaderLen;

  IpHeader = (IP_HEADER*)buf;
  IpHeaderLen = IpHeader-&gt;h_len * 4 ; // number of 32-bit words *4 = bytes

  if (bytes  &lt; IpHeaderLen + ICMP_MIN)
  {
	return;
  }
  IcmpHeader = (ICMP_HEADER*)(buf + IpHeaderLen);

  if (IcmpHeader-&gt;i_type != ICMP_ECHOREPLY)
  {
    if (IcmpHeader-&gt;i_type == ICMP_UNREACHABLE)
    {
      if(IcmpHeader-&gt;i_code == ICMP_CODE_HOST_UNREACHABLE)
      {
        return;
      }
      if(IcmpHeader-&gt;i_code == ICMP_CODE_NETWORK_UNREACHABLE)
      {
        return;
      }
    }
    else
    {
      return;
    }
  }

  if (IcmpHeader-&gt;i_id != id)
  {
    return;
  }
}

long ICMP_::WinsockStartup()
{
  long rc;

  WORD wVersionRequested;
  WSADATA wsaData;
  wVersionRequested = MAKEWORD(2, 1);

  rc = WSAStartup( wVersionRequested, &amp;wsaData );
  return rc;
}
</code></pre>
<pre><code class="language-cpp">DWORD WINAPI process(LPVOID lp_para)
{
	THREAD *t = (THREAD*)lp_para;	
	ICMP_ *icmp = new ICMP_;
	//DWORD cur_proc_addr = GetCurrentThreadId();

	while(!t-&gt;get_term()){
		if(t-&gt;get_work_state()){	
			DWORD cur_proc_addr = GetCurrentThreadId();
			int res;
			res = icmp-&gt;echo_ex(t-&gt;get_ip(), (unsigned short)cur_proc_addr);
			string tmp;

			if(!res){
				enter();				
				 tmp = &quot;&gt;  &quot; + t-&gt;get_ip() + &quot; -&gt;     reachable\n&quot;; 
				 fputs(tmp.c_str(), file);
				 cout &lt;&lt; cur_proc_addr &lt;&lt; &quot;     &quot;;
				 cout &lt;&lt; tmp;				 
				leave();
			} else{
				enter();				
				 tmp = &quot;&gt;  &quot; + t-&gt;get_ip() + &quot; -&gt;     -\n&quot;; 
				 fputs(tmp.c_str(), file);
				 cout &lt;&lt; tmp;
				leave();
			}

			t-&gt;set_work_state(false);
		}

		Sleep(1);
	}
	return ((DWORD) lp_para);
}
</code></pre>
<p>hi<br />
ich muss eine range anpingen. nur das &quot;pingen&quot; funktioniert nicht. die ergebnisse stimmen nicht, denn bei jeder ip kommt reachable raus.<br />
das problem tritt aber nur auf wenn ich die range mit hilfe von thread anpinge damits schneller geht. linear funktioniert alles einwandfrei mit threads jedoch nicht. habt ihr ne ahnung woran das liegen könnte?<br />
gruß xerxes</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/80253/icmp</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 04:37:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/80253.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Jul 2004 13:40:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to icmp on Thu, 29 Jul 2004 13:56:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream.h&gt;

#include &quot;icmp.h&quot;

using namespace std;

#define ICMP_ECHOREPLY                 0
#define ICMP_UNREACHABLE               3
#define ICMP_ECHO                      8

// 0 = Netz nicht erreichbar
#define ICMP_CODE_NETWORK_UNREACHABLE  0
// 1 = Rechner nicht erreichbar
#define ICMP_CODE_HOST_UNREACHABLE     1

// Minimalgrösse 8 Byte
#define ICMP_MIN            8

#define STATUS_FAILED       0xFFFF
#define DEF_PACKET_SIZE     32
#define MAX_PACKET          65000
</code></pre>
<pre><code class="language-cpp">int ICMP_::echo_ex(string ip, unsigned short cur_proc_addr)
{
  SOCKET sockRaw;
  SOCKADDR_IN addrDest;
  SOCKADDR_IN addrFrom;
  int addrFromLen = sizeof(addrFrom);
  HOSTENT* ptrHostent;
  unsigned long datasize;
  int RecvTimeout = 1000;
  char *dest_ip;
  char *icmp_data;
  char *recvbuf;
  unsigned int addr=0;
  unsigned short seq_no = 0;
  int BytesReceived;
  int BytesSent;
  long rc;
  unsigned ping_anzahl=0;

  sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  if (sockRaw == INVALID_SOCKET)
  {
    return 1;
  }
  rc = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&amp;RecvTimeout, sizeof(RecvTimeout));
  if(rc == SOCKET_ERROR)
  {
    return 1;
  }

  // Ip Adresse in ptrHostent geben
  ptrHostent = gethostbyname(ip.c_str());

  if ((!ptrHostent)  &amp;&amp; (addr == INADDR_NONE) )
  {
    return 1;
  }
  if (ptrHostent != NULL)
  {
    memcpy(&amp;(addrDest.sin_addr),ptrHostent-&gt;h_addr, ptrHostent-&gt;h_length);
  }
  else
  {
    addrDest.sin_addr.s_addr = addr;
  }
  if (ptrHostent)
  {
    addrDest.sin_family = ptrHostent-&gt;h_addrtype;
  }
  else
  {
    addrDest.sin_family = AF_INET;
  }

  // Konvertiert eine Netzwerk Adresse (SOCKADDR_IN) in einen String im Punkt Format (x.x.x.x)
  dest_ip = inet_ntoa(addrDest.sin_addr);

  // Gröss des Datenpaketes
  datasize = 32;

  if (datasize == 0)
  {
     datasize = DEF_PACKET_SIZE;
  }

  if (datasize &gt; MAX_PACKET)
  {
     datasize = DEF_PACKET_SIZE;
  }

  datasize += sizeof(ICMP_HEADER);

  icmp_data = (char*)malloc(MAX_PACKET);
  recvbuf = (char*)malloc(MAX_PACKET+sizeof(IP_HEADER)+sizeof(ICMP_HEADER));

  if (!icmp_data || !recvbuf)
  {
    return 1;
  }
  ostringstream os;
  os &lt;&lt; &quot;die prozess id: &quot; &lt;&lt; cur_proc_addr;
 // MessageBox(0, os.str().c_str(), &quot;PID&quot;, MB_OK);
  FillIcmpData(icmp_data, datasize, cur_proc_addr);

    ((ICMP_HEADER*)icmp_data)-&gt;i_cksum = 0;
    ((ICMP_HEADER*)icmp_data)-&gt;timestamp = GetTickCount();

    ((ICMP_HEADER*)icmp_data)-&gt;i_seq = seq_no++;
    ((ICMP_HEADER*)icmp_data)-&gt;i_cksum = checksum((unsigned short*)icmp_data, datasize);

    BytesSent = sendto(sockRaw,icmp_data,datasize,0,(SOCKADDR*)&amp;addrDest, sizeof(addrDest));

    if (BytesSent == SOCKET_ERROR)
    {
      if (WSAGetLastError() == WSAETIMEDOUT)
      {
      }
      return 1;
    }
    if (BytesSent &lt; datasize )
    {
   }
    BytesReceived = recvfrom(sockRaw,recvbuf,MAX_PACKET+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),0,(SOCKADDR*)&amp;addrFrom, &amp;addrFromLen);

   if (BytesReceived == SOCKET_ERROR)
    {
      if (WSAGetLastError() == WSAETIMEDOUT)
      {
      }

      return 1;
    }    
  closesocket(sockRaw);
  return 0;
}
</code></pre>
<pre><code class="language-cpp">void ICMP_::FillIcmpData(char *icmp_data, int datasize, unsigned short id)
{
  ICMP_HEADER *icmp_hdr;
  char *datapart;

  icmp_hdr = (ICMP_HEADER*)icmp_data;

  icmp_hdr-&gt;i_type = ICMP_ECHO;
  icmp_hdr-&gt;i_code = 0;
  icmp_hdr-&gt;i_id = id;
  icmp_hdr-&gt;i_cksum = 0;
  icmp_hdr-&gt;i_seq = 0;

  datapart = icmp_data + sizeof(ICMP_HEADER);
  // Den Buffer mit etwas füllen
  memset(datapart,'C', datasize - sizeof(ICMP_HEADER));
}

unsigned short ICMP_::checksum(unsigned short *buffer, int size)
{
  unsigned long cksum=0;
  while(size &gt;1)
  {
    cksum+=*buffer++;
    size -=sizeof(unsigned short);
  }

  if(size)
  {
    cksum += *(unsigned char*)buffer;
  }

  cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
  cksum += (cksum &gt;&gt;16);
  return (unsigned short)(~cksum);
}

void ICMP_::DecodeResponse(char *buf,int bytes, SOCKADDR_IN *from, unsigned short id)
{
  IP_HEADER   *IpHeader;
  ICMP_HEADER *IcmpHeader;
  unsigned short IpHeaderLen;

  IpHeader = (IP_HEADER*)buf;
  IpHeaderLen = IpHeader-&gt;h_len * 4 ; // number of 32-bit words *4 = bytes

  if (bytes  &lt; IpHeaderLen + ICMP_MIN)
  {
	return;
  }
  IcmpHeader = (ICMP_HEADER*)(buf + IpHeaderLen);

  if (IcmpHeader-&gt;i_type != ICMP_ECHOREPLY)
  {
    if (IcmpHeader-&gt;i_type == ICMP_UNREACHABLE)
    {
      if(IcmpHeader-&gt;i_code == ICMP_CODE_HOST_UNREACHABLE)
      {
        return;
      }
      if(IcmpHeader-&gt;i_code == ICMP_CODE_NETWORK_UNREACHABLE)
      {
        return;
      }
    }
    else
    {
      return;
    }
  }

  if (IcmpHeader-&gt;i_id != id)
  {
    return;
  }
}

long ICMP_::WinsockStartup()
{
  long rc;

  WORD wVersionRequested;
  WSADATA wsaData;
  wVersionRequested = MAKEWORD(2, 1);

  rc = WSAStartup( wVersionRequested, &amp;wsaData );
  return rc;
}
</code></pre>
<pre><code class="language-cpp">DWORD WINAPI process(LPVOID lp_para)
{
	THREAD *t = (THREAD*)lp_para;	
	ICMP_ *icmp = new ICMP_;
	//DWORD cur_proc_addr = GetCurrentThreadId();

	while(!t-&gt;get_term()){
		if(t-&gt;get_work_state()){	
			DWORD cur_proc_addr = GetCurrentThreadId();
			int res;
			res = icmp-&gt;echo_ex(t-&gt;get_ip(), (unsigned short)cur_proc_addr);
			string tmp;

			if(!res){
				enter();				
				 tmp = &quot;&gt;  &quot; + t-&gt;get_ip() + &quot; -&gt;     reachable\n&quot;; 
				 fputs(tmp.c_str(), file);
				 cout &lt;&lt; cur_proc_addr &lt;&lt; &quot;     &quot;;
				 cout &lt;&lt; tmp;				 
				leave();
			} else{
				enter();				
				 tmp = &quot;&gt;  &quot; + t-&gt;get_ip() + &quot; -&gt;     -\n&quot;; 
				 fputs(tmp.c_str(), file);
				 cout &lt;&lt; tmp;
				leave();
			}

			t-&gt;set_work_state(false);
		}

		Sleep(1);
	}
	return ((DWORD) lp_para);
}
</code></pre>
<p>hi<br />
ich muss eine range anpingen. nur das &quot;pingen&quot; funktioniert nicht. die ergebnisse stimmen nicht, denn bei jeder ip kommt reachable raus.<br />
das problem tritt aber nur auf wenn ich die range mit hilfe von thread anpinge damits schneller geht. linear funktioniert alles einwandfrei mit threads jedoch nicht. habt ihr ne ahnung woran das liegen könnte?<br />
gruß xerxes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/563744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/563744</guid><dc:creator><![CDATA[xerxes_]]></dc:creator><pubDate>Thu, 29 Jul 2004 13:56:36 GMT</pubDate></item></channel></rss>