<?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[Validieren einer Ip4-Addresse]]></title><description><![CDATA[<p>Ich code im Moment meine eigene kleine Netzwerkbibliothek und möchte jetzt die Funktion is_ip() für das Validieren von Ip4-Adressen schreiben.<br />
Eigentlich könnte man sowas ja wunderschön mit Regex's lösen, aber die gibts ja leider nicht im C++ Standard. Und Boost will ich für meine Bibliothek nicht vorraussetzen.</p>
<p>Im Moment sieht das ganze also so aus:<br />
(schnell in 5min hingekritzelt)</p>
<pre><code>bool is_ip(std::string ip)
{
	int numbers = 0;
	int dots = 0;

	for(std::string::iterator itor = ip.begin(); itor != ip.end(); itor++)
	{
		if((*itor)=='.')Ich bin über jetzten Ansatz dankbar.
			dots++;
		else if(std::isdigit(*itor))
			numbers++;
		else
			return false;
	}

	return (numbers &gt;= 4)
		&amp;&amp; (numbers &lt;= 12)
		&amp;&amp; (dots == 3);
}
</code></pre>
<p>Soweit funktioniert auch alles, nur dass eben noch nicht auf die min/max Werte der einzelnen Werte geachtet wird, sowas hier passiert also problemlos:<br />
366.366.366.366 obwohl es keine gültige Ip4-Adresse ist.<br />
Hat jemand eine Idee wie man das ganze Problem elegant mit möglichst wenig Spaghetti-Code lösen könnte?<br />
Ich glaube kaum dass meine Lösung die eleganteste ist, vielleicht weiß jemand wie man sowas in Benutzung mit find() löst.<br />
Ich bin über jeden Ansatz dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/143176/validieren-einer-ip4-addresse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 04:03:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143176.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Apr 2006 06:05:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 06:05:54 GMT]]></title><description><![CDATA[<p>Ich code im Moment meine eigene kleine Netzwerkbibliothek und möchte jetzt die Funktion is_ip() für das Validieren von Ip4-Adressen schreiben.<br />
Eigentlich könnte man sowas ja wunderschön mit Regex's lösen, aber die gibts ja leider nicht im C++ Standard. Und Boost will ich für meine Bibliothek nicht vorraussetzen.</p>
<p>Im Moment sieht das ganze also so aus:<br />
(schnell in 5min hingekritzelt)</p>
<pre><code>bool is_ip(std::string ip)
{
	int numbers = 0;
	int dots = 0;

	for(std::string::iterator itor = ip.begin(); itor != ip.end(); itor++)
	{
		if((*itor)=='.')Ich bin über jetzten Ansatz dankbar.
			dots++;
		else if(std::isdigit(*itor))
			numbers++;
		else
			return false;
	}

	return (numbers &gt;= 4)
		&amp;&amp; (numbers &lt;= 12)
		&amp;&amp; (dots == 3);
}
</code></pre>
<p>Soweit funktioniert auch alles, nur dass eben noch nicht auf die min/max Werte der einzelnen Werte geachtet wird, sowas hier passiert also problemlos:<br />
366.366.366.366 obwohl es keine gültige Ip4-Adresse ist.<br />
Hat jemand eine Idee wie man das ganze Problem elegant mit möglichst wenig Spaghetti-Code lösen könnte?<br />
Ich glaube kaum dass meine Lösung die eleganteste ist, vielleicht weiß jemand wie man sowas in Benutzung mit find() löst.<br />
Ich bin über jeden Ansatz dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031538</guid><dc:creator><![CDATA[the_teedude]]></dc:creator><pubDate>Thu, 06 Apr 2006 06:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 06:07:47 GMT]]></title><description><![CDATA[<p>Bist du dir sicher das man so eine Funktion überhaupt braucht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031540</guid><dc:creator><![CDATA[sc]]></dc:creator><pubDate>Thu, 06 Apr 2006 06:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 06:27:53 GMT]]></title><description><![CDATA[<p>in meine jetzigen design braucht man sie, ob nur mein design schlecht ist weiß ich nicht ^^.</p>
<p>ich habe einen namespace ip4</p>
<pre><code class="language-cpp">namespace ip4
{
		bool is_hostname(std::string hostname);
		bool is_ip(std::string ip);
		std::string ip_to_hostname(std::string ip);
		std::string hostname_to_ip(std::string hostname);

		class address
}
</code></pre>
<p>Jetzt erwarted der Konstruktor der Klasse address eine Zeichenkette die sowohl Ip-Addresse als auch Hostname sein kann (das wird mit ip4::is_ip() und ip4::is_hostname() geprüft). Ist es eine Ip wird es gleich in den privaten membere std::string ip gespeichert ansonsten erst mittels ip4::hostname_to_ip() konventiert und dann in ip gespeichert.</p>
<pre><code class="language-cpp">address(std::string ip_or_hostname, int port)
			{
				set_ip(ip_or_hostname);
				_port = port;
			}

			address(std::string ip_or_hostname)
			{
				set_ip(ip_or_hostname);
			}

			void set_ip(std::string ip_or_hostname)
			{
				if(is_hostname(ip_or_hostname))
					_ip = hostname_to_ip(ip_or_hostname);
				else
					_ip = ip_or_hostname;

				if(!is_ip(_ip))
				{
					//TODO: throw exception
				}
			}
</code></pre>
<p>Designvorschläge nehme ich gerne an ^^.<br />
Zu perfekt muss es aber nicht sein, ist ja nur für den privaten Gebrauch gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031549</guid><dc:creator><![CDATA[the_teedude]]></dc:creator><pubDate>Thu, 06 Apr 2006 06:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 06:35:00 GMT]]></title><description><![CDATA[<p>Ich würde die Funktion getaddrinfo nehmen. Die kommt mit Hostname und IP klar und kann auch IPv6.<br />
Oder wenn du es so lassen willst gibt es noch die Funktion inet_addr, die man zum Überprüfunen benutzen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031552</guid><dc:creator><![CDATA[sc]]></dc:creator><pubDate>Thu, 06 Apr 2006 06:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 06:38:46 GMT]]></title><description><![CDATA[<p>Versuch doch mal, die potentielle IP durch einen stringstream zu jagen und auszuwerten:</p>
<pre><code class="language-cpp">bool check_ip(const string&amp; ip)
{
  stringstream sdat(ip);
  unsigned short nums[4];
  char dots[3];
  sdat&gt;&gt;nums[0]&gt;&gt;dots[0]
      &gt;&gt;nums[1]&gt;&gt;dots[1]
      &gt;&gt;nums[2]&gt;&gt;dots[2]
      &gt;&gt;nums[3];
  /*
    jetzt kannst du den Inhalt von nums (alle Felder sollen &lt;256 sein),
    dots (soll nur '.' enthalten) und den Status von sdat (intakt) überprüfen
  */
}
</code></pre>
<p>(PS: Wenn du willst kannst du die einzelnen IP-Teile zur Weiterverarbeitung nutzen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031554</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 06 Apr 2006 06:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 06:51:20 GMT]]></title><description><![CDATA[<p>Sehr elegante Lösung CStoll, wusste garnicht dass stringstream das kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Habs jetzt aber trotzdem mal mit der von sc angesprochenen inet_addr gelöst, weil es kürzer ist. Man muss ja nicht immer das Rad neu erfinden.</p>
<pre><code class="language-cpp">bool is_ip(const std::string&amp; ip)
{
	return inet_addr(ip.c_str()) != INADDR_NONE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1031561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031561</guid><dc:creator><![CDATA[the_teedude]]></dc:creator><pubDate>Thu, 06 Apr 2006 06:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 07:09:44 GMT]]></title><description><![CDATA[<p>Wieso benutzt du iteratoren um durch den string zu gehen? Eine normale</p>
<pre><code class="language-cpp">for(size_t i = 0; i &lt; string.size(); ++i)
</code></pre>
<p>Schleife tuts doch auch?<br />
Ansonsten würde ich stringstreams nehmen, immer bis zum Punkt suchen, ab in den Stringstream und ein int daraus machen, dann den Wertebereich prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031575</guid><dc:creator><![CDATA[dfdfhdh]]></dc:creator><pubDate>Thu, 06 Apr 2006 07:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 11:26:52 GMT]]></title><description><![CDATA[<p>also ich würd mir nen struct/class für sone adresse basteln. die 4 komponenten werden private member variablen und beim setzen gibs ne simple überprüfung, ob die jeweils in der richtigen range liegen. wenn nicht, schmeisste ne exception.</p>
<p>so bleibts dem anwender überlassen, seine ips in dein struct zu drücken und eventuelle fehler abzufangen und auszubügeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031844</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Thu, 06 Apr 2006 11:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Thu, 06 Apr 2006 21:17:31 GMT]]></title><description><![CDATA[<p><a href="http://cplus.kompf.de/artikel/regex.html" rel="nofollow">http://cplus.kompf.de/artikel/regex.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1032251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1032251</guid><dc:creator><![CDATA[xGhost]]></dc:creator><pubDate>Thu, 06 Apr 2006 21:17:31 GMT</pubDate></item><item><title><![CDATA[Reply to Validieren einer Ip4-Addresse on Fri, 07 Apr 2006 11:56:30 GMT]]></title><description><![CDATA[<p>xGhost schrieb:</p>
<blockquote>
<p><a href="http://cplus.kompf.de/artikel/regex.html" rel="nofollow">http://cplus.kompf.de/artikel/regex.html</a></p>
</blockquote>
<p>the_teedude schrieb:</p>
<blockquote>
<p>[...]<br />
Eigentlich könnte man sowas ja wunderschön mit Regex's lösen, aber die gibts ja leider nicht im C++ Standard. Und Boost will ich für meine Bibliothek nicht vorraussetzen.<br />
[...]</p>
</blockquote>
<p>Danke nochmal an alle, hab das Problem jetzt wie gesagt gelöst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1032579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1032579</guid><dc:creator><![CDATA[the_teedude]]></dc:creator><pubDate>Fri, 07 Apr 2006 11:56:30 GMT</pubDate></item></channel></rss>