<?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[INVALID_SOCKET]]></title><description><![CDATA[<p>Hallo<br />
ich hab hier ein kleines Problem, und zwar:</p>
<p>ich habe einen server der folgendes macht.</p>
<pre><code class="language-cpp">void CNetzwerkClientKaSimDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen

	CDialog::OnTimer(nIDEvent);
	if(serverSteht==true){
		string verzeichnis=aktuellesVerzeichnis;
		ListenSocket.sortiereAuftraegeAusOrdner(verzeichnis);
		for(int i=0;i&lt;30;i++){
			if(clients[i]!=INVALID_SOCKET){
			  string auftrag=ListenSocket.gibEinenAuftrag();
			  auftrag=auftrag+&quot;TYPE:07&quot;; //auftragsenden
			  DatenSenden(i,auftrag); 
			}

	}

	}
}
</code></pre>
<p>also ich habe ein array der groesse 30 mit sockets. wenn sich der erste client anmeldet dann ist er im clients[0] der zweite client in clients[1] usw.</p>
<p>wenn jetzt aber zb. der erste client abstürzt (powerknopf) oder jemand einfach den clienten schliesst wobei bei einem schliessen dann folgende Methode aufgerufen wird</p>
<pre><code class="language-cpp">void CNetzwerkClientKaSimDlg::OnClose()
{
    client_connect.Close();

}
</code></pre>
<p>kriegt der server davon nichts mit, das heisst die if abfrage if(clients[i]!=INVALID_SOCKET) wobei i=0 ist zeigt nicht das der client nicht mehr da ist.</p>
<p>ich hätte jetzt gedacht sobald der client nicht mehr da ist, ist das socket ein INVALID_SOCKET aber anscheinend ist das nicht so.</p>
<p>koennt ihr mir sagen wie ich zb. erkennen kann ob der client noch da ist? bzw was ich falsch mache.</p>
<p>vielen dank und viele grüsse<br />
ender</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177047/invalid_socket</link><generator>RSS for Node</generator><lastBuildDate>Thu, 25 Jun 2026 07:23:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177047.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Mar 2007 17:08:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to INVALID_SOCKET on Tue, 27 Mar 2007 17:08:30 GMT]]></title><description><![CDATA[<p>Hallo<br />
ich hab hier ein kleines Problem, und zwar:</p>
<p>ich habe einen server der folgendes macht.</p>
<pre><code class="language-cpp">void CNetzwerkClientKaSimDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen

	CDialog::OnTimer(nIDEvent);
	if(serverSteht==true){
		string verzeichnis=aktuellesVerzeichnis;
		ListenSocket.sortiereAuftraegeAusOrdner(verzeichnis);
		for(int i=0;i&lt;30;i++){
			if(clients[i]!=INVALID_SOCKET){
			  string auftrag=ListenSocket.gibEinenAuftrag();
			  auftrag=auftrag+&quot;TYPE:07&quot;; //auftragsenden
			  DatenSenden(i,auftrag); 
			}

	}

	}
}
</code></pre>
<p>also ich habe ein array der groesse 30 mit sockets. wenn sich der erste client anmeldet dann ist er im clients[0] der zweite client in clients[1] usw.</p>
<p>wenn jetzt aber zb. der erste client abstürzt (powerknopf) oder jemand einfach den clienten schliesst wobei bei einem schliessen dann folgende Methode aufgerufen wird</p>
<pre><code class="language-cpp">void CNetzwerkClientKaSimDlg::OnClose()
{
    client_connect.Close();

}
</code></pre>
<p>kriegt der server davon nichts mit, das heisst die if abfrage if(clients[i]!=INVALID_SOCKET) wobei i=0 ist zeigt nicht das der client nicht mehr da ist.</p>
<p>ich hätte jetzt gedacht sobald der client nicht mehr da ist, ist das socket ein INVALID_SOCKET aber anscheinend ist das nicht so.</p>
<p>koennt ihr mir sagen wie ich zb. erkennen kann ob der client noch da ist? bzw was ich falsch mache.</p>
<p>vielen dank und viele grüsse<br />
ender</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254039</guid><dc:creator><![CDATA[sockets]]></dc:creator><pubDate>Tue, 27 Mar 2007 17:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Tue, 27 Mar 2007 20:13:21 GMT]]></title><description><![CDATA[<p>versuchs mal mit einem Select() vor dem senden, da tust du den client in das error und in das send set, das select wird .... eigentlich .... immer &gt; 0 ergeben (wenn kein error dann wird send gelingen, wenn send nicht gelingen wird, wird ein fehler vorliegen) du musst nur noch prüfen ob der socket im send oder im error set ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254178</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Tue, 27 Mar 2007 20:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Tue, 27 Mar 2007 22:21:10 GMT]]></title><description><![CDATA[<p>Ceos schrieb:</p>
<blockquote>
<p>versuchs mal mit einem Select() vor dem senden, da tust du den client in das error und in das send set, das select wird .... eigentlich .... immer &gt; 0 ergeben (wenn kein error dann wird send gelingen, wenn send nicht gelingen wird, wird ein fehler vorliegen) du musst nur noch prüfen ob der socket im send oder im error set ist</p>
</blockquote>
<p>hm, ich hatte angst das ne antwort mit select kommt, weil ich keinen plan hab wofür das gut ist und wie man das benutzt.<br />
könntest du mir vielleicht das in meinem code an der richtigen stelle einfügen also die select anweisung?<br />
verstehe nicht ganz was du meinst mit da tust du den client in das error und in das send set.</p>
<p>also kurz gesagt, verstehe ich nicht ganz die antwort zu benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254226</guid><dc:creator><![CDATA[sockets]]></dc:creator><pubDate>Tue, 27 Mar 2007 22:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Wed, 28 Mar 2007 05:38:51 GMT]]></title><description><![CDATA[<p><a href="http://msdn2.microsoft.com/en-us/library/ms740141.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms740141.aspx</a></p>
<p>versuchs mal damit, wenn dir das nicht hilft, heut nachmittag hab ich mehr zeit oder wer anderes hilft dir ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254254</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Wed, 28 Mar 2007 05:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Wed, 28 Mar 2007 10:36:13 GMT]]></title><description><![CDATA[<p>also ich sehe mann kan damit sockets überprüfen?!<br />
aber ich hab die in einem array drin, wie soll ich damit mehrere sockets überprüfen,indem ich select auf jedes einzelne socket im array anwende?</p>
<p>oder<br />
muss ich die vorher alle in ne andere structur packen mit der select umgehen kann?<br />
ich habe schon andere select tutorials gesehen aber irgendwie weiss ich nicht was ich davon halten soll,die erklären aber total umständlich, also wenn du die zeit hast wären ein kleiner edit bei mir am code so hilfreich das ich dadrch vielleicht select verstehen könnte.<br />
vielen dank nochmals</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254457</guid><dc:creator><![CDATA[sockets]]></dc:creator><pubDate>Wed, 28 Mar 2007 10:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Wed, 28 Mar 2007 16:11:36 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-403.html" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254796</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 28 Mar 2007 16:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Wed, 28 Mar 2007 16:18:21 GMT]]></title><description><![CDATA[<p>weiter unten in der beschreibung steht wie man mit FD_SET FD_ZERO FD_ISSET die fd_set manipuliert, du addest einfach alle sockets zu sets und die, die error zeigen löschst du einfach .... einfach iss gut .... aber ich denk du wirst das schon packen ^^</p>
<p>achte darauf deine sets immer mit FD_ZERO zu initialisieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254808</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Wed, 28 Mar 2007 16:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Thu, 29 Mar 2007 15:36:30 GMT]]></title><description><![CDATA[<p>Ceos schrieb:</p>
<blockquote>
<p>weiter unten in der beschreibung steht wie man mit FD_SET FD_ZERO FD_ISSET die fd_set manipuliert, du addest einfach alle sockets zu sets und die, die error zeigen löschst du einfach .... einfach iss gut .... aber ich denk du wirst das schon packen ^^</p>
<p>achte darauf deine sets immer mit FD_ZERO zu initialisieren</p>
</blockquote>
<p>Hallo, ich habe es jetzt versucht und mir etwas zusammengeschnippselt.<br />
das sieht so aus</p>
<pre><code class="language-cpp">char buf[256];
		int rc;
		FD_SET fdSet;
		FD_ZERO(&amp;fdSet);

		for(int i=0;i&lt;MAX_CLIENTS;i++){
			 if(clients[i]!=INVALID_SOCKET)
			 {
				 FD_SET(clients[i],&amp;fdSet);
			 }

		}

		rc=select(0,&amp;fdSet,NULL,NULL,NULL);

	    if(rc==SOCKET_ERROR){
			printf(&quot;Fehler: select, fehler code: %s\n&quot;,WSAGetLastError());
		}

		for(int i=0;i&lt;MAX_CLIENTS;i++){
			if(clients[i]==INVALID_SOCKET){
				continue; // ungültiger socket, d.h. kein verbunder client an dieser position im array
			}
			if(FD_ISSET(clients[i],&amp;fdSet)){
				 rc=recv(clients[i],buf,256,0);
				 // prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat
				 if(rc==0 || rc==SOCKET_ERROR){
					  printf(&quot;Client %d hat die Verbindung geschlossen\n&quot;,i);
					  closesocket(clients[i]); // socket schliessen          
					  clients[i].~client(); // seinen platz wieder freigeben
				 } 
			}
		}
</code></pre>
<p>so ersteinmal ich verwende CAsyncSocket<br />
vielleicht kann ich hier gar nicht select benutzen.<br />
select funktioniert nämlich nicht, wenn ich debugge<br />
hängt er bei diesem befehl --&gt; rc=select(0,&amp;fdSet,NULL,NULL,NULL);<br />
und weiter gehts nicht, ohne fehlermeldung.</p>
<p>muss ich AsyncSelect weil ich CAsyncSocket verwende benutzen?</p>
<p>ausserdem<br />
der letzte befehl im code clients[i].~client(); kann man das so machen?<br />
weil clients[i]=INVALID_SOCKET; geht nicht obwohl doch eine überprüfung<br />
if(clients[i]==INVALID_SOCKET) funktioniert.<br />
wenn ich aber clients[i]=INVALID_SOCKET; screibe dann kann er nicht konvertieren oder so ähnlich.</p>
<p>ich sitz schon heute wieder 3 stunden dran, bitte helft mir.<br />
viele grüsse ender<br />
und vielen dank nochmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255474</guid><dc:creator><![CDATA[Sockets]]></dc:creator><pubDate>Thu, 29 Mar 2007 15:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Thu, 29 Mar 2007 21:15:29 GMT]]></title><description><![CDATA[<p>hängt er bei diesem befehl --&gt; rc=select(0,&amp;fdSet,NULL,NULL,NULL);</p>
<p>klar das er hängt</p>
<p>du hast ihm auch ausschliesslich das readset gegeben!!!</p>
<p>select gibt nur &gt; 0 zurück wenn der socket NORMAL geschlossen wurdeoder irgendwelche daten anliegen.</p>
<p>deshalb musst du auch ein separates error und write set anlegen mit denselben sockets darin ..... ich meine das man fd_set klein schreibt wenn man den Typ verwendet</p>
<p>also fd_set ReadSet</p>
<p>mit<br />
FD_ZERO(&amp;ReadSet) löschst du das Set</p>
<p>und mit<br />
FD_SET(Socket, &amp;ReadSet) fügst du den socket hinzu</p>
<p>anschliessend prüfst du mt<br />
bool FD_ISSET(Socket,&amp;ReadSet) ob daten anliegen ein fehler anliegt oder ob der socket NICHT im schreibset liegt, was bedeutet er ist nicht sendebereit .... ansonsten übergib als TIMEOUT einfach ein mit 0 initialisiertes time_val struct und nicht einfach NULL</p>
<p>kann sein das das etwas verworren klingt, schau mal auf die postingzeit XD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255650</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Thu, 29 Mar 2007 21:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Thu, 29 Mar 2007 21:50:04 GMT]]></title><description><![CDATA[<p>danke für die antwqort, ich werde es dann versuchen umzusetzen.<br />
aber ist der server die ganze zeit geblockt? ich möchte auf dem server daten in nem ordner abfragen, alle 15 sekunden, deswegen mache ich das auch in der methode onTimer() . wenn ich einen timeout in select setze, geht der dann nach dem timeout aus dem select raus?<br />
viele grüsse<br />
ender<br />
ps. und jetzt ist es noch später <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/1255662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255662</guid><dc:creator><![CDATA[sockets]]></dc:creator><pubDate>Thu, 29 Mar 2007 21:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to INVALID_SOCKET on Fri, 30 Mar 2007 20:14:55 GMT]]></title><description><![CDATA[<p>wenn du die sockets in write error und read setzt, müsste er theoretisch nicht blocken, ansonsten, wenn du n timeout setzt, springt er nach dem timeout raus und liefert 0 zurück.</p>
<p>sockets im write_set liefern immer dann &gt; 1 wenn sie sendebereit sind (praktisch immer)</p>
<p>wenn sie es nicht sind sind sie MEISTENS im error-modus, kannst also mit dem error set prüfen (was in dem falle auch &gt; 1) liefert.</p>
<p>mit read set kannst du sowohl auf einen geschlossenen socket prüfen (select setzt diesen socket im read_set aber recv liefert unverholen 0 als rückgabe, was bedeutet socket closed)</p>
<p>als auch auf anliegende daten (um sie zu verarbeiten)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1256290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1256290</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Fri, 30 Mar 2007 20:14:55 GMT</pubDate></item></channel></rss>