<?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[<p>hi<br />
main.cpp</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;

#include &quot;thread.h&quot;
#include &quot;solv.h&quot;
#include &quot;icmp.h&quot;

#define MAX 1

using namespace std;

#pragma comment(lib, &quot;ws2_32.lib&quot;)
#pragma comment(lib, &quot;kernel32.lib&quot;)

DWORD WINAPI process(LPVOID lp_para);
string convert_int(int i);
int start_wsa(void);
void enter(void);
void leave(void);

LONG crit_sec = false; 

FILE *file;

int main()
{
	if(start_wsa()){
		cout &lt;&lt; &quot; WSA Error: &quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl &lt;&lt; endl;
		system(&quot;Pause&quot;);
		return 1;
	}

	file = fopen(&quot;C:\\icmp2.log&quot;, &quot;w&quot;);
	THREAD thread[MAX];
	for(int i = 0; i &lt; MAX; i++){
		if(thread[i].create_thread(process, (LPVOID)&amp;thread[i])){
			cout &lt;&lt; &quot;&gt;  Thread: &quot; &lt;&lt; i + 1 &lt;&lt; &quot; konnte nicht erstellt werden\n&quot;
				&quot;Das Programm wird beendet!\n\n&quot;;

			system(&quot;Pause&quot;);
			return 1;			
		}
		cout &lt;&lt; &quot;&gt;  Thread: &quot; &lt;&lt; i + 1 &lt;&lt; &quot; wurde erstellt\n&quot;;
	}

	for(i = 0; i &lt; 256; i++){
		for(int j = 0; true; j++){
			if(!thread[j % MAX].get_work_state()){	
				string cu_ip = &quot;213.147.0.&quot; + convert_int(i);
				thread[j % MAX].set_ip(cu_ip);
				thread[j % MAX].set_work_state(true);
				break;
			}
			Sleep(1);
		}
	}

	Sleep(3000);
	for(i = 0; i &lt; MAX; i++)
		thread[i].set_term(true);		

	system(&quot;Pause&quot;);
	return 0;
}

DWORD WINAPI process(LPVOID lp_para)
{
	THREAD *t = (THREAD*)lp_para;	

	DWORD cur_proc_addr = GetCurrentThreadId();
	ICMP_ *icmp = new ICMP_((unsigned short)cur_proc_addr);

	while(!t-&gt;get_term()){
		if(t-&gt;get_work_state()){	
			int res;
			res = icmp-&gt;echo_ex(t-&gt;get_ip());
			string tmp;

			if(!res){
				enter();				
				 tmp = &quot;   &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;   &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);
}

string convert_int(int i)
{
	stringstream str;
	string foo;

	str &lt;&lt; i;
	str &gt;&gt; foo;

	return foo;
}

void enter(void)
{
   while(InterlockedExchange(&amp;crit_sec, true) != false)
      Sleep(0); 
}

void leave(void)
{
   InterlockedExchange(&amp;crit_sec, false); 
}

int start_wsa(void)
{
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD( 2, 2);

	return WSAStartup( wVersionRequested, &amp;wsaData );
}
</code></pre>
<p>icmp.cpp</p>
<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

int ICMP_::echo_ex(string ip)
{
  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;

 // MessageBox(0, os.str().c_str(), &quot;PID&quot;, MB_OK);
  FillIcmpData(icmp_data, datasize);

    ((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)
{
  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 = cur_proc_addr;
  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)
{
  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 != cur_proc_addr)
  {
    return;
  }
}

long ICMP_::WinsockStartup()
{
  long rc;

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

  rc = WSAStartup( wVersionRequested, &amp;wsaData );
  return rc;
}
</code></pre>
<p>folgendes problem:<br />
wenn ich MAX auf 10 setzte sprich wenn 10 threads erstellt werden, sind die ping echos immer gleich, dh alle server sind nach dem programm erreichbar...<br />
jedoch kann das nicht stimmen. also ist das programm falsch, nur hab ich schon nach langen überlegungen keinen blassen schimmer woran es liegen könnte.<br />
also: mit einem bzw 2 thread bekomm ich die richtigen ergebnisse bei mehr als 2<br />
wird es verfälscht... hat jemand eine idee?</p>
<p>gruß _xerxes_</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/81243/icmp</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 11:27:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/81243.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 Jul 2004 12:44:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to icmp on Thu, 29 Jul 2004 14:05:55 GMT]]></title><description><![CDATA[<p>hi<br />
main.cpp</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;

#include &quot;thread.h&quot;
#include &quot;solv.h&quot;
#include &quot;icmp.h&quot;

#define MAX 1

using namespace std;

#pragma comment(lib, &quot;ws2_32.lib&quot;)
#pragma comment(lib, &quot;kernel32.lib&quot;)

DWORD WINAPI process(LPVOID lp_para);
string convert_int(int i);
int start_wsa(void);
void enter(void);
void leave(void);

LONG crit_sec = false; 

FILE *file;

int main()
{
	if(start_wsa()){
		cout &lt;&lt; &quot; WSA Error: &quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl &lt;&lt; endl;
		system(&quot;Pause&quot;);
		return 1;
	}

	file = fopen(&quot;C:\\icmp2.log&quot;, &quot;w&quot;);
	THREAD thread[MAX];
	for(int i = 0; i &lt; MAX; i++){
		if(thread[i].create_thread(process, (LPVOID)&amp;thread[i])){
			cout &lt;&lt; &quot;&gt;  Thread: &quot; &lt;&lt; i + 1 &lt;&lt; &quot; konnte nicht erstellt werden\n&quot;
				&quot;Das Programm wird beendet!\n\n&quot;;

			system(&quot;Pause&quot;);
			return 1;			
		}
		cout &lt;&lt; &quot;&gt;  Thread: &quot; &lt;&lt; i + 1 &lt;&lt; &quot; wurde erstellt\n&quot;;
	}

	for(i = 0; i &lt; 256; i++){
		for(int j = 0; true; j++){
			if(!thread[j % MAX].get_work_state()){	
				string cu_ip = &quot;213.147.0.&quot; + convert_int(i);
				thread[j % MAX].set_ip(cu_ip);
				thread[j % MAX].set_work_state(true);
				break;
			}
			Sleep(1);
		}
	}

	Sleep(3000);
	for(i = 0; i &lt; MAX; i++)
		thread[i].set_term(true);		

	system(&quot;Pause&quot;);
	return 0;
}

DWORD WINAPI process(LPVOID lp_para)
{
	THREAD *t = (THREAD*)lp_para;	

	DWORD cur_proc_addr = GetCurrentThreadId();
	ICMP_ *icmp = new ICMP_((unsigned short)cur_proc_addr);

	while(!t-&gt;get_term()){
		if(t-&gt;get_work_state()){	
			int res;
			res = icmp-&gt;echo_ex(t-&gt;get_ip());
			string tmp;

			if(!res){
				enter();				
				 tmp = &quot;   &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;   &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);
}

string convert_int(int i)
{
	stringstream str;
	string foo;

	str &lt;&lt; i;
	str &gt;&gt; foo;

	return foo;
}

void enter(void)
{
   while(InterlockedExchange(&amp;crit_sec, true) != false)
      Sleep(0); 
}

void leave(void)
{
   InterlockedExchange(&amp;crit_sec, false); 
}

int start_wsa(void)
{
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD( 2, 2);

	return WSAStartup( wVersionRequested, &amp;wsaData );
}
</code></pre>
<p>icmp.cpp</p>
<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

int ICMP_::echo_ex(string ip)
{
  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;

 // MessageBox(0, os.str().c_str(), &quot;PID&quot;, MB_OK);
  FillIcmpData(icmp_data, datasize);

    ((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)
{
  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 = cur_proc_addr;
  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)
{
  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 != cur_proc_addr)
  {
    return;
  }
}

long ICMP_::WinsockStartup()
{
  long rc;

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

  rc = WSAStartup( wVersionRequested, &amp;wsaData );
  return rc;
}
</code></pre>
<p>folgendes problem:<br />
wenn ich MAX auf 10 setzte sprich wenn 10 threads erstellt werden, sind die ping echos immer gleich, dh alle server sind nach dem programm erreichbar...<br />
jedoch kann das nicht stimmen. also ist das programm falsch, nur hab ich schon nach langen überlegungen keinen blassen schimmer woran es liegen könnte.<br />
also: mit einem bzw 2 thread bekomm ich die richtigen ergebnisse bei mehr als 2<br />
wird es verfälscht... hat jemand eine idee?</p>
<p>gruß _xerxes_</p>
]]></description><link>https://www.c-plusplus.net/forum/post/570966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/570966</guid><dc:creator><![CDATA[_xerxes_]]></dc:creator><pubDate>Thu, 29 Jul 2004 14:05:55 GMT</pubDate></item></channel></rss>