<?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[TCP Thread endet nicht]]></title><description><![CDATA[<p>Hi,<br />
warum beendet sich der TCPThread nicht?<br />
Hier bleibt er hängen:</p>
<pre><code class="language-cpp">WaitForSingleObject(TCPThread, INFINITE);
</code></pre>
<pre><code class="language-cpp">// Christoph Lang

#include &lt;stdio.h&gt;
#include &quot;winsock2.h&quot;
#include &lt;iostream&gt;
#include &lt;conio.h&gt;

using namespace std;

// --- Globale Variablen ---
int ThreadsRun(0);
HANDLE Event;

// --- UDP Thread ---
DWORD WINAPI UDPThreadProc( LPVOID lpParam ){ 

	// Erhöhe den Thread counter
	++ThreadsRun;
	cout &lt;&lt; &quot;Thread: &quot; &lt;&lt; ThreadsRun &lt;&lt; endl;
	while(true){
		Sleep(1);
		if(WaitForSingleObject(Event,0) == WAIT_OBJECT_0){
			cout &lt;&lt; &quot;UDPThread: Event ist angekommen&quot; &lt;&lt; endl;
			break;
		}
	}
	--ThreadsRun;
	return 0;
}

// --- TCP Thread ---
DWORD WINAPI TCPThreadProc( LPVOID lpParam ){ 
	// Erhöhe den Thread counter
	++ThreadsRun;
	cout &lt;&lt; &quot;Thread: &quot; &lt;&lt; ThreadsRun &lt;&lt; endl;

	while(true){
		SOCKET aSocket;
		aSocket = (SOCKET)lpParam;
		Sleep(1);
		if(WaitForSingleObject(Event,0) == WAIT_OBJECT_0){
			closesocket(aSocket);
			cout &lt;&lt; &quot;UDPThread: Event ist angekommen&quot; &lt;&lt; endl;
			break;
		}
	}
	--ThreadsRun;
	return 0;
}

int main() {

	// --- Winsock Initialisieren ---
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData);
	if (iResult != NO_ERROR)
	  cout &lt;&lt; &quot;Fehler bei Winsock&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;

	// --- Socket erstellen ---
	SOCKET aSocket;
	SOCKET Socket;
	Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (Socket == INVALID_SOCKET) {
		cout &lt;&lt; &quot;Fehler beim Socket erstellen&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;
	}

	// --- blockierung aufheben ---
	unsigned int mode(0); 
	if(ioctlsocket(Socket,FIONBIO,(u_long FAR*)&amp;mode) == SOCKET_ERROR){
		cout &lt;&lt; &quot;Fehler bei ioctrlsocket&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;
	}

	// --- selct() kram ---
	fd_set stReadFDS; // Socket Menge read
	struct timeval stTimeOut; // timeout
	stTimeOut.tv_usec = 1;

	// ----- clear sockets from fds structure
	FD_ZERO(&amp;stReadFDS);
	FD_SET(Socket,&amp;stReadFDS);

	// Socket Struktur erstellen
	sockaddr_in Service; 
	Service.sin_family = AF_INET;
	Service.sin_addr.s_addr = inet_addr( &quot;127.0.0.1&quot; );
	Service.sin_port = htons( 5000 );

	sockaddr_in Client;
	int Client_size = sizeof(Client);

	// --- Socket an die Struktur binden ---
	if (bind( Socket, (SOCKADDR*) &amp;Service, sizeof(Service)) == SOCKET_ERROR) {
		cout &lt;&lt; &quot;Fehler beim binden&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;
	}

	// --- Socket auf listen setzen ---
	if (listen( Socket, SOMAXCONN ) == SOCKET_ERROR)
		cout &lt;&lt; &quot;Fehler bei listen&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;

	// --- Event erstellen ---
	Event = CreateEvent( 
		NULL,     // no security attributes
		FALSE,    // auto-reset event
		FALSE,     // initial state is signaled
		NULL);    // object not named

	// --- UDPThread starten ---
	DWORD UDPdwThreadId;
	HANDLE UDPThread;
	UDPThread = CreateThread( 
		NULL,              // default security attributes
		0,                 // use default stack size  
		UDPThreadProc,        // thread function 
		NULL,             // argument to thread function 
		0,                 // use default creation flags 
		&amp;UDPdwThreadId);   // returns the thread identifier

	int nRet(0);
	HANDLE TCPThread;
	DWORD TCPdwThreadId;
	while(true){

	// ----- clear sockets from fds structure
	FD_ZERO(&amp;stReadFDS);
	FD_SET(Socket,&amp;stReadFDS);

		nRet = select(-1,&amp;stReadFDS,NULL,NULL,&amp;stTimeOut);
		if(nRet == SOCKET_ERROR)
			cout &lt;&lt; &quot;Fehler bei select&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;

		if(nRet != 0 &amp;&amp; nRet != SOCKET_ERROR) {
			if(FD_ISSET(Socket,&amp;stReadFDS) != 0) {
				// Kommt eine Clien connection an?
				aSocket = accept( Socket, (SOCKADDR*) &amp;Client, &amp;Client_size );
				cout &lt;&lt; &quot;accept durschlaufen&quot; &lt;&lt; endl;

				TCPThread = CreateThread( 
					NULL,              // default security attributes
					0,                 // use default stack size  
					TCPThreadProc,        // thread function 
					(void*)aSocket,             // argument to thread function 
					0,                 // use default creation flags 
					&amp;TCPdwThreadId);   // returns the thread identifier
			}
		}

	  // Wenn eine Taste gedrückt wurde setze das beenden in gang
		if(_kbhit()){
			if(_getch() == 'q'){
				cout &lt;&lt; &quot;q gedrueckt!&quot; &lt;&lt; endl;
				SetEvent(Event);
				break;		  
			}
		}
	}

	// --- Aufräumen ---
	closesocket(Socket);
	closesocket(aSocket);
	WaitForSingleObject(UDPThread, INFINITE);
	cout &lt;&lt; &quot;hier&quot; &lt;&lt; endl;
	WaitForSingleObject(TCPThread, INFINITE);
	WSACleanup();
	cout &lt;&lt; &quot;Threadsrun: &quot; &lt;&lt; ThreadsRun &lt;&lt; endl;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/207447/tcp-thread-endet-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 15:18:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207447.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Mar 2008 16:31:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to TCP Thread endet nicht on Fri, 07 Mar 2008 16:31:34 GMT]]></title><description><![CDATA[<p>Hi,<br />
warum beendet sich der TCPThread nicht?<br />
Hier bleibt er hängen:</p>
<pre><code class="language-cpp">WaitForSingleObject(TCPThread, INFINITE);
</code></pre>
<pre><code class="language-cpp">// Christoph Lang

#include &lt;stdio.h&gt;
#include &quot;winsock2.h&quot;
#include &lt;iostream&gt;
#include &lt;conio.h&gt;

using namespace std;

// --- Globale Variablen ---
int ThreadsRun(0);
HANDLE Event;

// --- UDP Thread ---
DWORD WINAPI UDPThreadProc( LPVOID lpParam ){ 

	// Erhöhe den Thread counter
	++ThreadsRun;
	cout &lt;&lt; &quot;Thread: &quot; &lt;&lt; ThreadsRun &lt;&lt; endl;
	while(true){
		Sleep(1);
		if(WaitForSingleObject(Event,0) == WAIT_OBJECT_0){
			cout &lt;&lt; &quot;UDPThread: Event ist angekommen&quot; &lt;&lt; endl;
			break;
		}
	}
	--ThreadsRun;
	return 0;
}

// --- TCP Thread ---
DWORD WINAPI TCPThreadProc( LPVOID lpParam ){ 
	// Erhöhe den Thread counter
	++ThreadsRun;
	cout &lt;&lt; &quot;Thread: &quot; &lt;&lt; ThreadsRun &lt;&lt; endl;

	while(true){
		SOCKET aSocket;
		aSocket = (SOCKET)lpParam;
		Sleep(1);
		if(WaitForSingleObject(Event,0) == WAIT_OBJECT_0){
			closesocket(aSocket);
			cout &lt;&lt; &quot;UDPThread: Event ist angekommen&quot; &lt;&lt; endl;
			break;
		}
	}
	--ThreadsRun;
	return 0;
}

int main() {

	// --- Winsock Initialisieren ---
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData);
	if (iResult != NO_ERROR)
	  cout &lt;&lt; &quot;Fehler bei Winsock&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;

	// --- Socket erstellen ---
	SOCKET aSocket;
	SOCKET Socket;
	Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (Socket == INVALID_SOCKET) {
		cout &lt;&lt; &quot;Fehler beim Socket erstellen&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;
	}

	// --- blockierung aufheben ---
	unsigned int mode(0); 
	if(ioctlsocket(Socket,FIONBIO,(u_long FAR*)&amp;mode) == SOCKET_ERROR){
		cout &lt;&lt; &quot;Fehler bei ioctrlsocket&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;
	}

	// --- selct() kram ---
	fd_set stReadFDS; // Socket Menge read
	struct timeval stTimeOut; // timeout
	stTimeOut.tv_usec = 1;

	// ----- clear sockets from fds structure
	FD_ZERO(&amp;stReadFDS);
	FD_SET(Socket,&amp;stReadFDS);

	// Socket Struktur erstellen
	sockaddr_in Service; 
	Service.sin_family = AF_INET;
	Service.sin_addr.s_addr = inet_addr( &quot;127.0.0.1&quot; );
	Service.sin_port = htons( 5000 );

	sockaddr_in Client;
	int Client_size = sizeof(Client);

	// --- Socket an die Struktur binden ---
	if (bind( Socket, (SOCKADDR*) &amp;Service, sizeof(Service)) == SOCKET_ERROR) {
		cout &lt;&lt; &quot;Fehler beim binden&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;
	}

	// --- Socket auf listen setzen ---
	if (listen( Socket, SOMAXCONN ) == SOCKET_ERROR)
		cout &lt;&lt; &quot;Fehler bei listen&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;

	// --- Event erstellen ---
	Event = CreateEvent( 
		NULL,     // no security attributes
		FALSE,    // auto-reset event
		FALSE,     // initial state is signaled
		NULL);    // object not named

	// --- UDPThread starten ---
	DWORD UDPdwThreadId;
	HANDLE UDPThread;
	UDPThread = CreateThread( 
		NULL,              // default security attributes
		0,                 // use default stack size  
		UDPThreadProc,        // thread function 
		NULL,             // argument to thread function 
		0,                 // use default creation flags 
		&amp;UDPdwThreadId);   // returns the thread identifier

	int nRet(0);
	HANDLE TCPThread;
	DWORD TCPdwThreadId;
	while(true){

	// ----- clear sockets from fds structure
	FD_ZERO(&amp;stReadFDS);
	FD_SET(Socket,&amp;stReadFDS);

		nRet = select(-1,&amp;stReadFDS,NULL,NULL,&amp;stTimeOut);
		if(nRet == SOCKET_ERROR)
			cout &lt;&lt; &quot;Fehler bei select&quot; &lt;&lt; WSAGetLastError() &lt;&lt; endl;

		if(nRet != 0 &amp;&amp; nRet != SOCKET_ERROR) {
			if(FD_ISSET(Socket,&amp;stReadFDS) != 0) {
				// Kommt eine Clien connection an?
				aSocket = accept( Socket, (SOCKADDR*) &amp;Client, &amp;Client_size );
				cout &lt;&lt; &quot;accept durschlaufen&quot; &lt;&lt; endl;

				TCPThread = CreateThread( 
					NULL,              // default security attributes
					0,                 // use default stack size  
					TCPThreadProc,        // thread function 
					(void*)aSocket,             // argument to thread function 
					0,                 // use default creation flags 
					&amp;TCPdwThreadId);   // returns the thread identifier
			}
		}

	  // Wenn eine Taste gedrückt wurde setze das beenden in gang
		if(_kbhit()){
			if(_getch() == 'q'){
				cout &lt;&lt; &quot;q gedrueckt!&quot; &lt;&lt; endl;
				SetEvent(Event);
				break;		  
			}
		}
	}

	// --- Aufräumen ---
	closesocket(Socket);
	closesocket(aSocket);
	WaitForSingleObject(UDPThread, INFINITE);
	cout &lt;&lt; &quot;hier&quot; &lt;&lt; endl;
	WaitForSingleObject(TCPThread, INFINITE);
	WSACleanup();
	cout &lt;&lt; &quot;Threadsrun: &quot; &lt;&lt; ThreadsRun &lt;&lt; endl;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1470141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470141</guid><dc:creator><![CDATA[Mitbewohner]]></dc:creator><pubDate>Fri, 07 Mar 2008 16:31:34 GMT</pubDate></item><item><title><![CDATA[Reply to TCP Thread endet nicht on Sat, 08 Mar 2008 16:41:35 GMT]]></title><description><![CDATA[<p>Wird er denn überhaupt gestartet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470590</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 08 Mar 2008 16:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to TCP Thread endet nicht on Sat, 08 Mar 2008 18:33:05 GMT]]></title><description><![CDATA[<p>Hat sich erledigt, danke <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/1470648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470648</guid><dc:creator><![CDATA[Mitbewohner]]></dc:creator><pubDate>Sat, 08 Mar 2008 18:33:05 GMT</pubDate></item></channel></rss>