<?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[Socket Kommunikation Befehl: select]]></title><description><![CDATA[<p>moin</p>
<p>hab da nen Problem:</p>
<p>Ich hab nen Drucker dem schick ich ein Label das er abarbeiten soll</p>
<p>&lt;STX&gt;TZTextname.00I;10&lt;CR&gt;Daten&lt;CR&gt;&lt;ETX&gt;</p>
<p>Wenn ich diesen Befehl sende bekomm ich ein &lt;ACK&gt; als antwort<br />
und wenn der Drucker gedruckt hat: &lt;STX&gt;1Ok&lt;ETX&gt;</p>
<p>Heist ich sende per Befehl: &quot;Set_VTEXT&quot;<br />
die variabelen Daten</p>
<p>und will per Befehl: &quot;IsPrint&quot;<br />
abfragen ob auf dem Socket Daten liegen -&gt; diese abholen -&gt; und überprüfen ob die Daten des Druckers mit den erwarteten Daten übereinstimmen um zu sagen er hat gedruckt.</p>
<p>Mein Problem war bisher das das &lt;ACK&gt; als eine Antwort kam und irgendwann später &lt;STX&gt;1Ok&lt;ETX&gt; als Antwort kam und mein Programm per recv() ewig auf die Antwort gewartet hat und dadurch mein Programm geblockt hat...</p>
<p>nun hab ich gelesen das man mit Hilfe des Befehls select() nachfragen kann ob überhaupt erstmal was auf dem Socket liegt was man mit recv() abholen kann</p>
<p>also hab ich das versucht einzubauen ...<br />
nur leider liefert mir das select immer nur eine fehlermeldung (10038) zurück...</p>
<p>was mach ich falsch??</p>
<pre><code>bool CMainFrame::cmdServer(CString cmd, CString ip, int port){
	/////////////Connect Anfang////////////////
	long rc;
	SOCKET s;
	SOCKADDR_IN addr;
	bool ret=false;
	inUse = true;
	FD_SET fdSet;

	CStringArray r_cmd;
	int iNum_CMD = ParseTokens( r_cmd, cmd, &quot;|&quot;);
	CString * param;
	int anz_param = 0;
	if(iNum_CMD&gt;1){
		cmd = r_cmd[0];
		param = new CString[iNum_CMD-1];

		anz_param=iNum_CMD-1;

		for(int cmd_i=0; cmd_i&lt;(iNum_CMD-1); cmd_i++){
			param[cmd_i] = r_cmd[cmd_i+1];
		}
	}

	rc=startWinsock();
	if(rc!=0) {
		CString str;
		str.Format(&quot;%d&quot;,rc);
	    AfxMessageBox(&quot;Fehler: startWinsock, fehler code: &quot;+str);
		WSACleanup();
		ret=false;
		return ret;
	} 

	s=socket(AF_INET,SOCK_STREAM,0);
	if(s==INVALID_SOCKET) {
		CString str;
		str.Format(&quot;%d&quot;,WSAGetLastError());
		AfxMessageBox(&quot;Fehler: Der Socket konnte nicht erstellt werden, fehler code: &quot;+str);
		closesocket(s);
		WSACleanup();
		ret=false;
		return ret;
	}

	memset(&amp;addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
	addr.sin_family=AF_INET;
	addr.sin_port=htons(port);
	addr.sin_addr.s_addr=inet_addr(ip);

	rc=connect(s,(SOCKADDR*)&amp;addr,sizeof(SOCKADDR));
	if(rc==SOCKET_ERROR){
		CString str;
		str.Format(&quot;%d&quot;,WSAGetLastError());
		AfxMessageBox(&quot;Fehler: connect gescheitert, fehler code: &quot;+str);
		closesocket(s);
		WSACleanup();
		ret=false;
		//OnVerbindungVerbindungtrennen();
		return ret;
	} 
	/////////////Connect Ende////////////////	

	/////////////Befehle Anfang////////////////

	FD_SET(s,&amp;fdSet);

	if(cmd.CompareNoCase(&quot;BLUHM_ON&quot;)==0){
		int len=0;
		CString cmd=&quot;&quot;;
		CString cmd_return=&quot;&quot;;
		//Ok&lt;CR&gt;
		CString cmd_return_soll=&quot;4F 6B 0D&quot;;

		FD_ZERO(&amp;fdSet); // Inhalt leeren

		CString cmd_erg;
		// &lt;ESC&gt; + C1 + &lt;CR&gt;
		cmd_erg.Format(&quot;%cC1%c&quot;,ConvertStringHexToChar(&quot;1B&quot;), ConvertStringHexToChar(&quot;0D&quot;));

		len=cmd_erg.GetLength()+1;
		char * buf = new char[len];
		memcpy(buf,cmd_erg, len);

		ret=SendBlock(s, buf,len);

		char *recvbuffer=NULL;
		recvbuffer = new char[1024];
		rc=recv(s,recvbuffer,1024,0);
		if(rc==SOCKET_ERROR) {
			CString str;
			str.Format(&quot;%d&quot;,WSAGetLastError());
			AfxMessageBox(&quot;Fehler: recvfrom, fehler code: &quot;+str);
		} else {
			recvbuffer[rc]='\0';
			CString tmp=&quot;&quot;, tmp2=&quot;&quot;;

			for(int xx=0; xx&lt;rc; xx++){
				tmp.Format(&quot;%x&quot;, recvbuffer[xx]);
				if(tmp.GetLength()&lt;2){
					tmp=&quot;0&quot;+tmp;
				}
				if(tmp.GetLength()&gt;2){
					CString tmp3=&quot;&quot;;
					for(int iy=tmp.GetLength()-2; iy&lt;tmp.GetLength(); iy++){
						tmp3=tmp3+tmp.GetAt(iy);
					}
					tmp=tmp3;
				}
				if(xx&lt;(rc-1)){
					tmp=tmp+&quot; &quot;;
				}
				tmp2=tmp2+tmp;
			}
			if(tmp2.CompareNoCase(cmd_return_soll)!=0){
				CString meldung;
				meldung.Format(&quot;Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);
			}else{
				ret=TRUE;
				CString meldung;
				meldung.Format(&quot;Kein Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);
			}
		}
		delete[] recvbuffer;
		delete[] buf;
	}

	if(cmd.CompareNoCase(&quot;BLUHM_SET_VTEXT&quot;)==0){
		int len=0;
		CString cmd=&quot;&quot;;
		// &lt;ACK&gt;
		CString cmd_return_soll_1=&quot;06&quot;;
		// &lt;STX&gt;1Ok&lt;ETX&gt;
		CString cmd_return_soll_2=&quot;02 31 4F 4B 03&quot;;

		CString lm=param[0];
		//CString lm=&quot;GS1.00I&quot;;

		CString cmd_erg;
		// &lt;STX&gt;TZTextname.00I;10&lt;CR&gt;&lt;ETX&gt;
		cmd_erg.Format(&quot;%cTZ%s;10%c&quot;,ConvertStringHexToChar(&quot;02&quot;), lm, ConvertStringHexToChar(&quot;0D&quot;));

		for(int i=1; i&lt;anz_param; i++){
			cmd_erg=cmd_erg+param[i]+ConvertStringHexToChar(&quot;0D&quot;);
		}

		cmd_erg = cmd_erg + ConvertStringHexToChar(&quot;03&quot;);

		len=cmd_erg.GetLength()+1;
		char * buf = new char[len];
		memcpy(buf,cmd_erg, len);

		ret=SendBlock(s, buf,len);

		char *recvbuffer=NULL; 
		recvbuffer = new char[1024];
		rc=recv(s,recvbuffer,1024,0);
		if(rc==SOCKET_ERROR) {
			CString str;
			str.Format(&quot;%d&quot;,WSAGetLastError());
			AfxMessageBox(&quot;Fehler: recvfrom, fehler code: &quot;+str);
		} else {
			recvbuffer[rc]='\0';
			CString tmp=&quot;&quot;, tmp2=&quot;&quot;;

			for(int xx=0; xx&lt;rc; xx++){
				tmp.Format(&quot;%x&quot;, recvbuffer[xx]);
				if(tmp.GetLength()&lt;2){
					tmp=&quot;0&quot;+tmp;
				}
				if(xx&lt;(rc-1)){
					tmp=tmp+&quot; &quot;;
				}
				tmp2=tmp2+tmp;
			}
			if(tmp2.CompareNoCase(cmd_return_soll_1)==0){
				ret=TRUE;
				CString meldung;
				meldung.Format(&quot;Kein Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);

			}else{
				CString meldung;
				meldung.Format(&quot;Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);
			}
		}
		delete[] recvbuffer;
		delete[] buf;
	}

	if(cmd.CompareNoCase(&quot;BLUHM_ISPRINT&quot;)==0){
		int len=0;
		CString cmd=&quot;&quot;;
		CString cmd_return=&quot;&quot;;
		// &lt;STX&gt;1Ok&lt;ETX&gt;
		CString cmd_return_soll=&quot;02 31 4F 4B 03&quot;;
		CString tmp=&quot;&quot;, tmp2=&quot;&quot;;

		struct timeval tv;
		tv.tv_sec = 1;
		tv.tv_usec = 0;

		char *recvbuffer=NULL;
		rc=select(1,&amp;fdSet,NULL,NULL, &amp;tv); 
	    if(rc==SOCKET_ERROR) {
			CString ausg;
			ausg.Format(&quot;Fehler: select, fehler code: %i \n&quot;,WSAGetLastError());
			AfxMessageBox(ausg);
		}else{

			CString ausg;
			ausg.Format(&quot;%i&quot;,rc);
			AfxMessageBox(&quot;ausg:&quot;+ausg);

			recvbuffer = new char[1024];
			rc=recv(s,recvbuffer,1024,0);

			if(rc==SOCKET_ERROR) {
				CString str;
				str.Format(&quot;%d&quot;,WSAGetLastError());
				AfxMessageBox(&quot;Fehler: recvfrom, fehler code: &quot;+str);
			} else {
				recvbuffer[rc]='\0';

				for(int xx=0; xx&lt;rc; xx++){
					tmp.Format(&quot;%x&quot;, recvbuffer[xx]);
					if(tmp.GetLength()&lt;2){
						tmp=&quot;0&quot;+tmp;
					}
					if(xx&lt;(rc-1)){
						tmp=tmp+&quot; &quot;;
					}
					tmp2=tmp2+tmp;
				}
				//AfxMessageBox(tmp2);
				if(tmp2.CompareNoCase(cmd_return_soll)==0){
					ret=TRUE;
					CString meldung;
					meldung.Format(&quot;Kein Fehler: %s&quot;,tmp2);
					AfxMessageBox(meldung);
				}else{
					CString meldung;
					meldung.Format(&quot;Fehler: %s&quot;,tmp2);
					AfxMessageBox(meldung);
				}
			}
		}
		delete[] recvbuffer;
	}

	/////////////Befehle Ende////////////////

	/////////////Disconnect Anfang////////////////
	closesocket(s);
	WSACleanup();
	/////////////Disconnect Ende////////////////
	inUse = false;
	return ret;
}
</code></pre>
<p>mfg LT</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277409/socket-kommunikation-befehl-select</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 21:00:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277409.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Nov 2010 09:56:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 09:56:06 GMT]]></title><description><![CDATA[<p>moin</p>
<p>hab da nen Problem:</p>
<p>Ich hab nen Drucker dem schick ich ein Label das er abarbeiten soll</p>
<p>&lt;STX&gt;TZTextname.00I;10&lt;CR&gt;Daten&lt;CR&gt;&lt;ETX&gt;</p>
<p>Wenn ich diesen Befehl sende bekomm ich ein &lt;ACK&gt; als antwort<br />
und wenn der Drucker gedruckt hat: &lt;STX&gt;1Ok&lt;ETX&gt;</p>
<p>Heist ich sende per Befehl: &quot;Set_VTEXT&quot;<br />
die variabelen Daten</p>
<p>und will per Befehl: &quot;IsPrint&quot;<br />
abfragen ob auf dem Socket Daten liegen -&gt; diese abholen -&gt; und überprüfen ob die Daten des Druckers mit den erwarteten Daten übereinstimmen um zu sagen er hat gedruckt.</p>
<p>Mein Problem war bisher das das &lt;ACK&gt; als eine Antwort kam und irgendwann später &lt;STX&gt;1Ok&lt;ETX&gt; als Antwort kam und mein Programm per recv() ewig auf die Antwort gewartet hat und dadurch mein Programm geblockt hat...</p>
<p>nun hab ich gelesen das man mit Hilfe des Befehls select() nachfragen kann ob überhaupt erstmal was auf dem Socket liegt was man mit recv() abholen kann</p>
<p>also hab ich das versucht einzubauen ...<br />
nur leider liefert mir das select immer nur eine fehlermeldung (10038) zurück...</p>
<p>was mach ich falsch??</p>
<pre><code>bool CMainFrame::cmdServer(CString cmd, CString ip, int port){
	/////////////Connect Anfang////////////////
	long rc;
	SOCKET s;
	SOCKADDR_IN addr;
	bool ret=false;
	inUse = true;
	FD_SET fdSet;

	CStringArray r_cmd;
	int iNum_CMD = ParseTokens( r_cmd, cmd, &quot;|&quot;);
	CString * param;
	int anz_param = 0;
	if(iNum_CMD&gt;1){
		cmd = r_cmd[0];
		param = new CString[iNum_CMD-1];

		anz_param=iNum_CMD-1;

		for(int cmd_i=0; cmd_i&lt;(iNum_CMD-1); cmd_i++){
			param[cmd_i] = r_cmd[cmd_i+1];
		}
	}

	rc=startWinsock();
	if(rc!=0) {
		CString str;
		str.Format(&quot;%d&quot;,rc);
	    AfxMessageBox(&quot;Fehler: startWinsock, fehler code: &quot;+str);
		WSACleanup();
		ret=false;
		return ret;
	} 

	s=socket(AF_INET,SOCK_STREAM,0);
	if(s==INVALID_SOCKET) {
		CString str;
		str.Format(&quot;%d&quot;,WSAGetLastError());
		AfxMessageBox(&quot;Fehler: Der Socket konnte nicht erstellt werden, fehler code: &quot;+str);
		closesocket(s);
		WSACleanup();
		ret=false;
		return ret;
	}

	memset(&amp;addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
	addr.sin_family=AF_INET;
	addr.sin_port=htons(port);
	addr.sin_addr.s_addr=inet_addr(ip);

	rc=connect(s,(SOCKADDR*)&amp;addr,sizeof(SOCKADDR));
	if(rc==SOCKET_ERROR){
		CString str;
		str.Format(&quot;%d&quot;,WSAGetLastError());
		AfxMessageBox(&quot;Fehler: connect gescheitert, fehler code: &quot;+str);
		closesocket(s);
		WSACleanup();
		ret=false;
		//OnVerbindungVerbindungtrennen();
		return ret;
	} 
	/////////////Connect Ende////////////////	

	/////////////Befehle Anfang////////////////

	FD_SET(s,&amp;fdSet);

	if(cmd.CompareNoCase(&quot;BLUHM_ON&quot;)==0){
		int len=0;
		CString cmd=&quot;&quot;;
		CString cmd_return=&quot;&quot;;
		//Ok&lt;CR&gt;
		CString cmd_return_soll=&quot;4F 6B 0D&quot;;

		FD_ZERO(&amp;fdSet); // Inhalt leeren

		CString cmd_erg;
		// &lt;ESC&gt; + C1 + &lt;CR&gt;
		cmd_erg.Format(&quot;%cC1%c&quot;,ConvertStringHexToChar(&quot;1B&quot;), ConvertStringHexToChar(&quot;0D&quot;));

		len=cmd_erg.GetLength()+1;
		char * buf = new char[len];
		memcpy(buf,cmd_erg, len);

		ret=SendBlock(s, buf,len);

		char *recvbuffer=NULL;
		recvbuffer = new char[1024];
		rc=recv(s,recvbuffer,1024,0);
		if(rc==SOCKET_ERROR) {
			CString str;
			str.Format(&quot;%d&quot;,WSAGetLastError());
			AfxMessageBox(&quot;Fehler: recvfrom, fehler code: &quot;+str);
		} else {
			recvbuffer[rc]='\0';
			CString tmp=&quot;&quot;, tmp2=&quot;&quot;;

			for(int xx=0; xx&lt;rc; xx++){
				tmp.Format(&quot;%x&quot;, recvbuffer[xx]);
				if(tmp.GetLength()&lt;2){
					tmp=&quot;0&quot;+tmp;
				}
				if(tmp.GetLength()&gt;2){
					CString tmp3=&quot;&quot;;
					for(int iy=tmp.GetLength()-2; iy&lt;tmp.GetLength(); iy++){
						tmp3=tmp3+tmp.GetAt(iy);
					}
					tmp=tmp3;
				}
				if(xx&lt;(rc-1)){
					tmp=tmp+&quot; &quot;;
				}
				tmp2=tmp2+tmp;
			}
			if(tmp2.CompareNoCase(cmd_return_soll)!=0){
				CString meldung;
				meldung.Format(&quot;Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);
			}else{
				ret=TRUE;
				CString meldung;
				meldung.Format(&quot;Kein Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);
			}
		}
		delete[] recvbuffer;
		delete[] buf;
	}

	if(cmd.CompareNoCase(&quot;BLUHM_SET_VTEXT&quot;)==0){
		int len=0;
		CString cmd=&quot;&quot;;
		// &lt;ACK&gt;
		CString cmd_return_soll_1=&quot;06&quot;;
		// &lt;STX&gt;1Ok&lt;ETX&gt;
		CString cmd_return_soll_2=&quot;02 31 4F 4B 03&quot;;

		CString lm=param[0];
		//CString lm=&quot;GS1.00I&quot;;

		CString cmd_erg;
		// &lt;STX&gt;TZTextname.00I;10&lt;CR&gt;&lt;ETX&gt;
		cmd_erg.Format(&quot;%cTZ%s;10%c&quot;,ConvertStringHexToChar(&quot;02&quot;), lm, ConvertStringHexToChar(&quot;0D&quot;));

		for(int i=1; i&lt;anz_param; i++){
			cmd_erg=cmd_erg+param[i]+ConvertStringHexToChar(&quot;0D&quot;);
		}

		cmd_erg = cmd_erg + ConvertStringHexToChar(&quot;03&quot;);

		len=cmd_erg.GetLength()+1;
		char * buf = new char[len];
		memcpy(buf,cmd_erg, len);

		ret=SendBlock(s, buf,len);

		char *recvbuffer=NULL; 
		recvbuffer = new char[1024];
		rc=recv(s,recvbuffer,1024,0);
		if(rc==SOCKET_ERROR) {
			CString str;
			str.Format(&quot;%d&quot;,WSAGetLastError());
			AfxMessageBox(&quot;Fehler: recvfrom, fehler code: &quot;+str);
		} else {
			recvbuffer[rc]='\0';
			CString tmp=&quot;&quot;, tmp2=&quot;&quot;;

			for(int xx=0; xx&lt;rc; xx++){
				tmp.Format(&quot;%x&quot;, recvbuffer[xx]);
				if(tmp.GetLength()&lt;2){
					tmp=&quot;0&quot;+tmp;
				}
				if(xx&lt;(rc-1)){
					tmp=tmp+&quot; &quot;;
				}
				tmp2=tmp2+tmp;
			}
			if(tmp2.CompareNoCase(cmd_return_soll_1)==0){
				ret=TRUE;
				CString meldung;
				meldung.Format(&quot;Kein Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);

			}else{
				CString meldung;
				meldung.Format(&quot;Fehler: %s&quot;,tmp2);
				AfxMessageBox(meldung);
			}
		}
		delete[] recvbuffer;
		delete[] buf;
	}

	if(cmd.CompareNoCase(&quot;BLUHM_ISPRINT&quot;)==0){
		int len=0;
		CString cmd=&quot;&quot;;
		CString cmd_return=&quot;&quot;;
		// &lt;STX&gt;1Ok&lt;ETX&gt;
		CString cmd_return_soll=&quot;02 31 4F 4B 03&quot;;
		CString tmp=&quot;&quot;, tmp2=&quot;&quot;;

		struct timeval tv;
		tv.tv_sec = 1;
		tv.tv_usec = 0;

		char *recvbuffer=NULL;
		rc=select(1,&amp;fdSet,NULL,NULL, &amp;tv); 
	    if(rc==SOCKET_ERROR) {
			CString ausg;
			ausg.Format(&quot;Fehler: select, fehler code: %i \n&quot;,WSAGetLastError());
			AfxMessageBox(ausg);
		}else{

			CString ausg;
			ausg.Format(&quot;%i&quot;,rc);
			AfxMessageBox(&quot;ausg:&quot;+ausg);

			recvbuffer = new char[1024];
			rc=recv(s,recvbuffer,1024,0);

			if(rc==SOCKET_ERROR) {
				CString str;
				str.Format(&quot;%d&quot;,WSAGetLastError());
				AfxMessageBox(&quot;Fehler: recvfrom, fehler code: &quot;+str);
			} else {
				recvbuffer[rc]='\0';

				for(int xx=0; xx&lt;rc; xx++){
					tmp.Format(&quot;%x&quot;, recvbuffer[xx]);
					if(tmp.GetLength()&lt;2){
						tmp=&quot;0&quot;+tmp;
					}
					if(xx&lt;(rc-1)){
						tmp=tmp+&quot; &quot;;
					}
					tmp2=tmp2+tmp;
				}
				//AfxMessageBox(tmp2);
				if(tmp2.CompareNoCase(cmd_return_soll)==0){
					ret=TRUE;
					CString meldung;
					meldung.Format(&quot;Kein Fehler: %s&quot;,tmp2);
					AfxMessageBox(meldung);
				}else{
					CString meldung;
					meldung.Format(&quot;Fehler: %s&quot;,tmp2);
					AfxMessageBox(meldung);
				}
			}
		}
		delete[] recvbuffer;
	}

	/////////////Befehle Ende////////////////

	/////////////Disconnect Anfang////////////////
	closesocket(s);
	WSACleanup();
	/////////////Disconnect Ende////////////////
	inUse = false;
	return ret;
}
</code></pre>
<p>mfg LT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982122</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 09:56:06 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 10:25:48 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">rc=select(1,&amp;fdSet,NULL,NULL, &amp;tv);
</code></pre>
<p>versuchs mal mit rc = select(1, &amp;fdSer, NULL,NULL, tv);</p>
<p>Gruss IchBinNichtSicher</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982135</guid><dc:creator><![CDATA[IchBinNichtSicher]]></dc:creator><pubDate>Thu, 18 Nov 2010 10:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 10:42:08 GMT]]></title><description><![CDATA[<blockquote>
<p>versuchs mal mit rc = select(1, &amp;fdSer, NULL,NULL, tv);</p>
</blockquote>
<p>^^ was soll das bringen ? fdSer gibts bei mir net als variable und tv ohne &amp; bringt fehelrmeldung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982152</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 10:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 11:03:44 GMT]]></title><description><![CDATA[<p>Also vorneweg ich hab mich jetzt nicht durch deinen Code gequält, aber ein paar Punkte zum Ablauf.<br />
Du kannst drei Filedeskriptoren-Sets (read/write/exception) an select() übergeben und ein Timeout. Bevor du select() aufrufts, musst du die gewünschten Sockets in das Set schreiben, evtl. vorher alles löschen. Wenn select() zurück kommt, dann ist entweder ein timeout aufgetreten, ein Fehler oder ein Socket-Ereignis. Das Socket-Ereignis ist dann im jeweiligen Set gesetzt, also der Socket. Das musst du überprüfen. Sprich wenn kein Ereignis auftritt ist das Set leer, auch wenn du vorher einen Socket eingetragen hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982158</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Thu, 18 Nov 2010 11:03:44 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 11:24:06 GMT]]></title><description><![CDATA[<p>Error 10038:<br />
WSAENOTSOCK One of the descriptor sets contains an entry which is not a socket.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982165</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 18 Nov 2010 11:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 11:29:12 GMT]]></title><description><![CDATA[<p>ok frage zu deinem geschriebenen:</p>
<p>reihnfolge bei mir siet wie folgt aus:</p>
<p>-&gt; Connect<br />
-&gt; FD_SET(soc,&amp;fdSet);<br />
-&gt; FD_ZERO(&amp;fdset)<br />
-&gt; Befehl: ON an Drucker (Bluhm_ON)<br />
-&gt; Disconnect</p>
<p>-&gt; Connect<br />
-&gt; FD_SET(soc,&amp;fdSet);<br />
-&gt; Befehl: SET_VTEXT an Drucker (Bluhm_SET_VTEXT) mit entsprechenden Parameter<br />
-&gt; Disconnect</p>
<p>-&gt; Connect<br />
-&gt; FD_SET(soc,&amp;fdSet);<br />
-&gt; Befehl: IsPrint an Drucker (Bluhm_ISPRINT)<br />
-&gt; rc=select(1,&amp;fdSet,NULL,NULL, &amp;tv);<br />
-&gt; &lt;-- hier kommt fehlermeldung 10038 (Objekt sei kein socket)<br />
-&gt; Disconnect</p>
<p>^^ wieso kommt da das fdset kein socket sei oder was versteh ich da falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982168</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 11:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 11:50:20 GMT]]></title><description><![CDATA[<p>LordTerra schrieb:</p>
<blockquote>
<p>ok frage zu deinem geschriebenen:</p>
<p>reihnfolge bei mir siet wie folgt aus:</p>
<p>-&gt; Connect<br />
-&gt; FD_SET(soc,&amp;fdSet);<br />
-&gt; FD_ZERO(&amp;fdset)<br />
-&gt; Befehl: ON an Drucker (Bluhm_ON)<br />
-&gt; Disconnect</p>
<p>-&gt; Connect<br />
-&gt; FD_SET(soc,&amp;fdSet);<br />
-&gt; Befehl: SET_VTEXT an Drucker (Bluhm_SET_VTEXT) mit entsprechenden Parameter<br />
-&gt; Disconnect</p>
<p>-&gt; Connect<br />
-&gt; FD_SET(soc,&amp;fdSet);<br />
-&gt; Befehl: IsPrint an Drucker (Bluhm_ISPRINT)<br />
-&gt; rc=select(1,&amp;fdSet,NULL,NULL, &amp;tv);<br />
-&gt; &lt;-- hier kommt fehlermeldung 10038 (Objekt sei kein socket)<br />
-&gt; Disconnect</p>
<p>^^ wieso kommt da das fdset kein socket sei oder was versteh ich da falsch?</p>
</blockquote>
<pre><code class="language-cpp">FD_SET(s,&amp;fdSet);

    if(cmd.CompareNoCase(&quot;BLUHM_ON&quot;)==0){
        int len=0;
        CString cmd=&quot;&quot;;
        CString cmd_return=&quot;&quot;;
        //Ok&lt;CR&gt;
        CString cmd_return_soll=&quot;4F 6B 0D&quot;;

        FD_ZERO(&amp;fdSet); // Inhalt leeren
</code></pre>
<p>Du fügst den Socket der verbindungen annimmt zu, fdSet hinzu und leerst den Inhalt ein paar Zeilen wieder.</p>
<p>Gruss IchBinNichtSicher</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982186</guid><dc:creator><![CDATA[IchBinNichtSicher]]></dc:creator><pubDate>Thu, 18 Nov 2010 11:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 11:54:44 GMT]]></title><description><![CDATA[<p>hmmm jo mach ich weil ich gelesen hab das man das machen muss ...</p>
<p>also laut der webseite (sorry link net mehr da) hies es :<br />
- man soll den socket aufmachen<br />
- dann den fdset<br />
- dann fdzero &lt;--- nur beim 1. mal</p>
<p>daher hab ich das fdzero dort hingeschrieben wo ich das zwar 1 mal ausführe aber vor dem setvtext und vor isprint</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982189</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 11:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 12:17:30 GMT]]></title><description><![CDATA[<p>LordTerra schrieb:</p>
<blockquote>
<p>hmmm jo mach ich weil ich gelesen hab das man das machen muss ...</p>
<p>also laut der webseite (sorry link net mehr da) hies es :<br />
- man soll den socket aufmachen<br />
- dann den fdset<br />
- dann fdzero &lt;--- nur beim 1. mal</p>
<p>daher hab ich das fdzero dort hingeschrieben wo ich das zwar 1 mal ausführe aber vor dem setvtext und vor isprint</p>
</blockquote>
<p>fdzero must du vor fdset hinschreiben.</p>
<p>Gruss IchBinNichtSicher</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982201</guid><dc:creator><![CDATA[IchBinNichtSicher]]></dc:creator><pubDate>Thu, 18 Nov 2010 12:17:30 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 12:37:07 GMT]]></title><description><![CDATA[<p>Ein fd_set ist nichts weiter, wie eine Datenstruktur, wo du Sockets eintragen kannst. FD_ZERO rufts du nur auf, um sicher zu stellen, dass das fd_set leer ist. Das fd_set selber macht gar nichts. Damit damit etwas geschieht, musst du es an select() übergeben, oder eine andere Funktion, die damit arbeiten kann.<br />
Eigentlich ist das auch in der MSDN recht umfangreich und ausführlich beschrieben.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982219</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Thu, 18 Nov 2010 12:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 12:52:56 GMT]]></title><description><![CDATA[<p>Nick Unbekannt schrieb:</p>
<blockquote>
<p>Ein fd_set ist nichts weiter, wie eine Datenstruktur, wo du Sockets eintragen kannst. FD_ZERO rufts du nur auf, um sicher zu stellen, dass das fd_set leer ist. Das fd_set selber macht gar nichts. Damit damit etwas geschieht, musst du es an select() übergeben, oder eine andere Funktion, die damit arbeiten kann.<br />
Eigentlich ist das auch in der MSDN recht umfangreich und ausführlich beschrieben.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx</a></p>
</blockquote>
<p>So wie ich immer gedacht habe löscht FD_ZERO den Inhalt von fd_set, und das hat er getan <strong>nachdem</strong> er FD_SET aufruft.</p>
<p>Er übergibt fd_set leer an select().<br />
Möglicherweise kommt daher die Fehlermeldung 10038 (Objekt ist kein socket).</p>
<p>Gruss IchBinNichtSicherr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982234</guid><dc:creator><![CDATA[IchBinNichtSicher]]></dc:creator><pubDate>Thu, 18 Nov 2010 12:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 12:55:46 GMT]]></title><description><![CDATA[<p>ok wenn ich das zero vor den set mache bekomm ich immer nur &quot;0&quot; als rückgabewert ... egal wie ich es mache ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982237</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 12:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 12:59:09 GMT]]></title><description><![CDATA[<p>IchBinNichtSicher schrieb:</p>
<blockquote>
<p>Nick Unbekannt schrieb:</p>
<blockquote>
<p>Ein fd_set ist nichts weiter, wie eine Datenstruktur, wo du Sockets eintragen kannst. FD_ZERO rufts du nur auf, um sicher zu stellen, dass das fd_set leer ist. Das fd_set selber macht gar nichts. Damit damit etwas geschieht, musst du es an select() übergeben, oder eine andere Funktion, die damit arbeiten kann.<br />
Eigentlich ist das auch in der MSDN recht umfangreich und ausführlich beschrieben.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx</a></p>
</blockquote>
<p>So wie ich immer gedacht habe löscht FD_ZERO den Inhalt von fd_set, und das hat er getan <strong>nachdem</strong> er FD_SET aufruft.</p>
<p>Er übergibt fd_set leer an select().<br />
Möglicherweise kommt daher die Fehlermeldung 10038 (Objekt ist kein socket).</p>
<p>Gruss IchBinNichtSicherr</p>
</blockquote>
<p>^^ das problem hierbei ist aber :</p>
<p>ich rufe das conntect mehrfach auf !!!</p>
<p>also ich connecte mich führe nen start des druckers aus und disconnecte mich wieder...</p>
<p>dann concete ich mich um ein set text auszuführen (dieses liefert 2 rückgaben auf recv)</p>
<p>ich warte die 1. ab und disconnecte mich wieder</p>
<p>dann conntecte ich mich neu und warte auf das 2. recv</p>
<p>und ich glaube das geht nicht ... aber da bin ich mir net sicher -.-</p>
<p>mfg LT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982239</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 12:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 13:04:28 GMT]]></title><description><![CDATA[<p>IchBinNichtSicher schrieb:</p>
<blockquote>
<p>So wie ich immer gedacht habe löscht FD_ZERO den Inhalt von fd_set,</p>
</blockquote>
<p>Das ist auch richtig so. Ich habe auch nicht auf deinen Beitrag geantwortet. Mir ist nur aufgefallen, dass er im gleichen Kontext die Makros ohne select() benutzt und das ist Unsinn.</p>
<p>IchBinNichtSicher schrieb:</p>
<blockquote>
<p>Er übergibt fd_set leer an select().<br />
Möglicherweise kommt daher die Fehlermeldung 10038 (Objekt ist kein socket).</p>
</blockquote>
<p>Eigentlich und da bin ich mir nicht sicher, dürfte er die Fehlermeldung nur bringen, wenn du versuchst einen Nicht-Socket in der Datenstruktur abzulegen. Ob man bei select() zwangsläufig mindestens einen Socket angeben muss weiß ich nicht, aber man kann über das Timeout eine Pause realisieren, welche auch ohne Socket nützlich sein kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982246</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Thu, 18 Nov 2010 13:04:28 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 13:12:59 GMT]]></title><description><![CDATA[<p>Sich mehrmals zu verbinden ist prinzipiell auch kein Problem. Wobei ich nicht verstehe, warum du die Verbindung beenden musst? Solange dein Druckauftrag läuft kann uns soll sich niemand anders mit dem Drucker verbinden. Wenn du die Verbindung blockierst erhältst du also auch mehr Sicherheit. Ich würde aber mal deinen Code stark überdenken und in kleine Funktionen/Methoden aufteilen. So wie er jetzt da steht, ist er sehr schwer zu lesen und zu verstehen. Damit erhöhst du nur unnötig das Fehlerrisiko. Die Verbindung offen zu lassen würde aber vieles einfacher machen, außer es gibt einen Grund dafür es nicht zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982254</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Thu, 18 Nov 2010 13:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 13:24:12 GMT]]></title><description><![CDATA[<p>moin</p>
<p>jo es hat schon nen sinn das ich mich immer nur für ein kommando mit dem drucker verbinde ... das tool was ich schreib is nen überwachungstool und es soll von verschiedenen stellen möglich sein den drucker zu überwachen ... daher muss ich das so programmieren ...</p>
<p>zum thema unleserlichkeit ... hmmm ganz ehrlich ich dachte eigentlich das ich es eben schon gut gekapselt hab ... was soll ich denn deiner meinung nach noch auslagern ???</p>
<p>mfg lt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982261</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 13:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 13:46:42 GMT]]></title><description><![CDATA[<p>Da musst du selber mal drüber schauen, was man zusammen fassen kann oder evtl. sogar wiederverwenden. Vielleicht muss man auch Sachen allgemeiner formulieren, damit sie öfters angewandt werden können. Verringert aber trotzdem die Möglichkeiten von Fehlern enorm. Zuviel sollte man natürlich auch nicht zusammenfassen, nicht dass die Fallunterscheidungen überhand nehmen. Wenn du meinst es ist gut gegliedert und es kann auch nichts mehr zusammengefasst werden, dann kann du immer noch die einzelnen Schritte in Funktionen packen und in deiner Funktion aufrufen.<br />
Das ist aber nur ein Vorschlag, ich will dir nicht vorschreiben, wie du deine Programme zu schreiben hast. Was für dich sicher auch noch interessant sein könnte ist das Stichwort Objektorientierung.<br />
Wenn du dir ein Objekt Drucker anlegst, dann kannst du dort im Konstruktor deine Initialisierung vornehmen und den Destruktor alles wieder aufräumen lassen. Heißt du musst dich nicht mehr selber darum kümmern. Dem Objekt verpasst du dann noch eine Methode zum Senden, welche kurzfristig die Verbindung herstellt und vielleicht eine zum Lesen. Ich kenne jetzt aber dein Anforderungsprofil auch nicht.<br />
Durch einen übersichtlicheren Quelltext hättest du mich zum Beispiel auch dazu animieren können, ihn einmal zu lesen. Um zu verstehen was du wirklich machen willst. Wenn ich erst ewig lange grübeln muss, dann hab ich dazu keine Lust mehr. Wobei ich es auch gar nicht erst versucht habe, weil du mich vorher schon abgeschreckt hast. So kompliziert muss also dein Ablauf gar nicht sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982281</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Thu, 18 Nov 2010 13:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 15:05:26 GMT]]></title><description><![CDATA[<p>hmmm mag sein das es auch einfacher geht ...</p>
<p>aber naja so schwierig find ich meinen quellcode gar net ...<br />
erst kommt n bissi was zur socket-verbindung<br />
dann kommen die befehle die in senden und empfangen aufgegliedert sind<br />
und dann kommt n bissi dicsonncet kram also find den code nu net so unübersichtlich ... aber is sicher ansichtssache <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>aber problem besteht immer noch ...<br />
also im mom hab ich das fd_zero vor den fd_set gesetzt<br />
(wohlgemerkt bei jeder komunikation)</p>
<p>ergebnis= ich bekomm immer ne 0 als returnwert von select()</p>
<p>is also auch net das was ich will ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982337</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Thu, 18 Nov 2010 15:05:26 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Thu, 18 Nov 2010 18:46:41 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Zum einen, wenn 0 zurückkommt bedeutet das nur das dein Timeout von 1 sec abgelaufen ist und mehr nicht. Also entweder erhöst du deinen Timeout oder du musst die Methode mehrfach in einer Schleife aufrufen. So in etwas (Vorsicht nur PseudoCode):</p>
<pre><code>while (empfangen) {
  FD_ZERO(fdset);
  FD_SET(socket, &amp;fdset);
  ret = select(0, &amp;fdset, null, null, &amp;tv);
  if (0 &lt; ret) {
    if (FD_ISSET(socket, &amp;fdset)) {
      // es kamm was an
      ret = recv(....)
      if (SOCKET_ERROR != ret) {
        // Daten auswerten
      }
      else {
        // Die Verbindung wurde getrennt
      }
      empfangen = true;
    }
  }
} // while (....
</code></pre>
<p>Nur so nebenbei, select ist ausgelegt um auf mehrere Sockets gleichzeitig zu hören, du könntest auch jederzeit denn Socket entsprechend umstellen das er Asynchron läuft, dann musst du die Wartezeit zwischen den Aufrufen nur selber mit Sleep einbauen. Aber um die While-Schleife wirst nicht rumkommen.</p>
<p>MfG Marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982476</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Thu, 18 Nov 2010 18:46:41 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Kommunikation Befehl: select on Fri, 19 Nov 2010 07:08:43 GMT]]></title><description><![CDATA[<p>danke dir marco ...</p>
<p>die schleife hatte ich eh vor zu benutzen</p>
<p>mein programm ruft ja den cmdserver auf ...</p>
<p>so nach dem motto:</p>
<pre><code>CString cmd=&quot;BLUHM_ON&quot;;
if(cmdServer(cmd, ip , port)){

  cmd=&quot;BLUHM_SET_VTEXT&quot;;
  if(cmdServer(cmd, ip , port)){

    do{
      cmd=&quot;BLUHM_ISPRINT&quot;;
      if(cmdServer(cmd, ip , port)){
        AfxMessageBox(&quot;Hat gedruckt mach noch was&quot;);
      }
    }while(&quot;bis ich sage stop&quot;);
  }
}
</code></pre>
<p>mfg kala</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982654</guid><dc:creator><![CDATA[LordTerra]]></dc:creator><pubDate>Fri, 19 Nov 2010 07:08:43 GMT</pubDate></item></channel></rss>