<?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[winsock ( getaddrinfo ) : access violation error]]></title><description><![CDATA[<p>ich versuche gerade die adresse eines hosts durch dessen Namen zu ermitteln. auch wenns nicht so viel sinn macht wollte ich mir, bei erfolg der funktion getaddrinfo, trotzdem nochmal den namen des hosts ausgeben lassen, allerdings tritt dabei immer eine accesviolationexception auf. hier mal der code:</p>
<pre><code class="language-cpp">#include &lt;winsock2.h&gt;
#include &lt;ws2tcpip.h&gt;

addrinfo* hostinfo(const char* hostname, const char* servname=&quot;http&quot;, const addrinfo* hints=0) 
{
	int ret;
	addrinfo* res=0;

	if(hints==0)
	{
		addrinfo aiHints;
		memset(&amp;aiHints, 0, sizeof(aiHints));
		aiHints.ai_family=AF_INET;
		aiHints.ai_socktype=SOCK_STREAM;
		aiHints.ai_protocol=IPPROTO_TCP;
		aiHints.ai_flags=AI_CANONNAME;
		ret=getaddrinfo(hostname, servname, &amp;aiHints, &amp;res);
	}	

	else
	{
		ret=getaddrinfo(hostname, servname, hints, &amp;res);
	}

	if(ret!=0)
		return 0;		
	else
		return res;
}

int main()
{
	addrinfo* res=0;
	addrinfo* ptr=0;
	int ret;
	WSADATA wsa;

	ret=WSAStartup(MAKEWORD(2,0), &amp;wsa);
	if(ret!=0)
		return 1;

	res=hostinfo(&quot;www.google.de&quot;,80);

	if(res==0)
		return 2;

	for(ptr=res; ptr; ptr=ptr-&gt;ai_next)
		std::cout&lt;&lt;ptr-&gt;ai_canonname&lt;&lt;std::endl;

	freeaddrinfo(res);
	WSACleanup();
	std::cin.ignore(2,'\n');
	return 0;
}
</code></pre>
<p>der fehler tritt bei der ausgabe in der schleife aufm weiss aber nicht warum. ausserdem würd mich noch interessieren: gibts ne standardfunktion die dasselbe macht wie itoa, dann könnte ich nämlich den port/service als integer übergeben lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177347/winsock-getaddrinfo-access-violation-error</link><generator>RSS for Node</generator><lastBuildDate>Fri, 26 Jun 2026 19:21:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177347.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Mar 2007 13:21:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 13:21:03 GMT]]></title><description><![CDATA[<p>ich versuche gerade die adresse eines hosts durch dessen Namen zu ermitteln. auch wenns nicht so viel sinn macht wollte ich mir, bei erfolg der funktion getaddrinfo, trotzdem nochmal den namen des hosts ausgeben lassen, allerdings tritt dabei immer eine accesviolationexception auf. hier mal der code:</p>
<pre><code class="language-cpp">#include &lt;winsock2.h&gt;
#include &lt;ws2tcpip.h&gt;

addrinfo* hostinfo(const char* hostname, const char* servname=&quot;http&quot;, const addrinfo* hints=0) 
{
	int ret;
	addrinfo* res=0;

	if(hints==0)
	{
		addrinfo aiHints;
		memset(&amp;aiHints, 0, sizeof(aiHints));
		aiHints.ai_family=AF_INET;
		aiHints.ai_socktype=SOCK_STREAM;
		aiHints.ai_protocol=IPPROTO_TCP;
		aiHints.ai_flags=AI_CANONNAME;
		ret=getaddrinfo(hostname, servname, &amp;aiHints, &amp;res);
	}	

	else
	{
		ret=getaddrinfo(hostname, servname, hints, &amp;res);
	}

	if(ret!=0)
		return 0;		
	else
		return res;
}

int main()
{
	addrinfo* res=0;
	addrinfo* ptr=0;
	int ret;
	WSADATA wsa;

	ret=WSAStartup(MAKEWORD(2,0), &amp;wsa);
	if(ret!=0)
		return 1;

	res=hostinfo(&quot;www.google.de&quot;,80);

	if(res==0)
		return 2;

	for(ptr=res; ptr; ptr=ptr-&gt;ai_next)
		std::cout&lt;&lt;ptr-&gt;ai_canonname&lt;&lt;std::endl;

	freeaddrinfo(res);
	WSACleanup();
	std::cin.ignore(2,'\n');
	return 0;
}
</code></pre>
<p>der fehler tritt bei der ausgabe in der schleife aufm weiss aber nicht warum. ausserdem würd mich noch interessieren: gibts ne standardfunktion die dasselbe macht wie itoa, dann könnte ich nämlich den port/service als integer übergeben lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256007</guid><dc:creator><![CDATA[rudi_07]]></dc:creator><pubDate>Fri, 30 Mar 2007 13:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 13:42:55 GMT]]></title><description><![CDATA[<p>Erstmal übergibst du der Funktion hostinfo einen int-Wert, wo sie einen char* erwartet (daß das durch den Compiler kommt, ist erstaunlich).</p>
<p>Zweitens solltest du dir die original zurückgegebene addrinfo* aufheben, damit du den richtigen Wert wieder freigeben kannst (Stichwort &quot;Speicherleck&quot;).</p>
<p>Und drittens @itoa() - wirf mal einen Blick in die FAQ unter &quot;Einmal zahl und zurück&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256032</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 13:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 14:22:16 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Erstmal übergibst du der Funktion hostinfo einen int-Wert, wo sie einen char* erwartet (daß das durch den Compiler kommt, ist erstaunlich).</p>
</blockquote>
<p>Ups, ich hatte eine Version die const char* als 2. parameter erwartet unt eine mit int(und dann itoa verwendet; habs wohl beim posten übersehn zu korrigieren)</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Zweitens solltest du dir die original zurückgegebene addrinfo* aufheben, damit du den richtigen Wert wieder freigeben kannst (Stichwort &quot;Speicherleck&quot;).</p>
</blockquote>
<p>zeigt der zeiger der zurückgegeben wird nicht auf den gleichen speicherbereich wie der, in der die liste von getaddrinfo nachher steht? oder wie sollte ichs sonst machen? addrinfo** zurückgeben?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Und drittens @itoa() - wirf mal einen Blick in die FAQ unter &quot;Einmal zahl und zurück&quot;.</p>
</blockquote>
<p>ok vielen dank, wird da gut erklärt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256074</guid><dc:creator><![CDATA[rudi_07]]></dc:creator><pubDate>Fri, 30 Mar 2007 14:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 15:42:57 GMT]]></title><description><![CDATA[<p>rudi_07 schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Zweitens solltest du dir die original zurückgegebene addrinfo* aufheben, damit du den richtigen Wert wieder freigeben kannst (Stichwort &quot;Speicherleck&quot;).</p>
</blockquote>
<p>zeigt der zeiger der zurückgegeben wird nicht auf den gleichen speicherbereich wie der, in der die liste von getaddrinfo nachher steht? oder wie sollte ichs sonst machen? addrinfo** zurückgeben?</p>
</blockquote>
<p>Nach dem Aufruf von hostadr() ja, nach der Ausgabe-Schleife nicht mehr. Deshalb brauchst du eine zusätzliche Variable, die du die Liste durchlaufen lassen kannst.</p>
<p>(ansonsten könnte es natürlich auch sein, daß du die falschen Parameter an getaddrinfor() übergeben hast - damit kenne ich mich nicht so aus)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256122</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 15:42:57 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 15:51:08 GMT]]></title><description><![CDATA[<p>aber ich hab doch die variable res, die die adresse speichert, und verwende zum durchlaufen ptr oder versteh ich da was falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256128</guid><dc:creator><![CDATA[rudi_07]]></dc:creator><pubDate>Fri, 30 Mar 2007 15:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 16:01:55 GMT]]></title><description><![CDATA[<p>*Brille putzt* OK, du hast recht - dann ziehe ich meine Bemerkung zurück.</p>
<p>PS: Ich hab' mir doch mal die Manpage zu <a href="http://man.cx/getaddrinfo" rel="nofollow">man: getaddrinfo</a> angesehen:</p>
<blockquote>
<p>If the AI_CANONNAME bit is set, a successful call to getaddrinfo() will return a NUL-terminated string containing the canonical name of the specified hostname in the ai_canonname element <strong>of the first addrinfo</strong> structure returned.</p>
</blockquote>
<p>(Auf Deutsch: Der Name steht im ersten Element der Liste - in den übrigen Elementen steht vermutlich Müll (oder schlicht NULL).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256139</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 16:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 16:54:56 GMT]]></title><description><![CDATA[<p>@ CStoll: Vielen Dank, also ich werds so nochmal versuchen, ohne die schleife dann weil ich glaube vor der exception wurde noch kurz irgendein string ausgegeben und vermutlich war das nächste element nicht NULL, das element ai_canonname diese zeigers aber schon. das wurde ja nirgends abgefragt deshalb könnte ich mir vorstellen dass es daher kommt (kanns im moment leider nich prüfen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256181</guid><dc:creator><![CDATA[rudi_07]]></dc:creator><pubDate>Fri, 30 Mar 2007 16:54:56 GMT</pubDate></item><item><title><![CDATA[Reply to winsock ( getaddrinfo ) : access violation error on Fri, 30 Mar 2007 17:23:54 GMT]]></title><description><![CDATA[<p>jupp, klappt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
einfach die entsprechende stelle im code ersetzen durch:</p>
<pre><code class="language-cpp">for(ptr=res; ptr; ptr=ptr-&gt;ai_next)
    if(ptr-&gt;ai_canonname)
        std::cout&lt;&lt;ptr-&gt;ai_canonname&lt;&lt;std::endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1256200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256200</guid><dc:creator><![CDATA[rudi_07]]></dc:creator><pubDate>Fri, 30 Mar 2007 17:23:54 GMT</pubDate></item></channel></rss>