TCP Thread endet nicht



  • Hi,
    warum beendet sich der TCPThread nicht?
    Hier bleibt er hängen:

    WaitForSingleObject(TCPThread, INFINITE);
    
    // Christoph Lang
    
    #include <stdio.h>
    #include "winsock2.h"
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    // --- Globale Variablen ---
    int ThreadsRun(0);
    HANDLE Event;
    
    // --- UDP Thread ---
    DWORD WINAPI UDPThreadProc( LPVOID lpParam ){ 
    
    	// Erhöhe den Thread counter
    	++ThreadsRun;
    	cout << "Thread: " << ThreadsRun << endl;
    	while(true){
    		Sleep(1);
    		if(WaitForSingleObject(Event,0) == WAIT_OBJECT_0){
    			cout << "UDPThread: Event ist angekommen" << endl;
    			break;
    		}
    	}
    	--ThreadsRun;
    	return 0;
    }
    
    // --- TCP Thread ---
    DWORD WINAPI TCPThreadProc( LPVOID lpParam ){ 
    	// Erhöhe den Thread counter
    	++ThreadsRun;
    	cout << "Thread: " << ThreadsRun << endl;
    
    	while(true){
    		SOCKET aSocket;
    		aSocket = (SOCKET)lpParam;
    		Sleep(1);
    		if(WaitForSingleObject(Event,0) == WAIT_OBJECT_0){
    			closesocket(aSocket);
    			cout << "UDPThread: Event ist angekommen" << endl;
    			break;
    		}
    	}
    	--ThreadsRun;
    	return 0;
    }
    
    int main() {
    
    	// --- Winsock Initialisieren ---
    	WSADATA wsaData;
    	int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    	if (iResult != NO_ERROR)
    	  cout << "Fehler bei Winsock" << WSAGetLastError() << endl;
    
    	// --- Socket erstellen ---
    	SOCKET aSocket;
    	SOCKET Socket;
    	Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (Socket == INVALID_SOCKET) {
    		cout << "Fehler beim Socket erstellen" << WSAGetLastError() << endl;
    	}
    
    	// --- blockierung aufheben ---
    	unsigned int mode(0); 
    	if(ioctlsocket(Socket,FIONBIO,(u_long FAR*)&mode) == SOCKET_ERROR){
    		cout << "Fehler bei ioctrlsocket" << WSAGetLastError() << endl;
    	}
    
    	// --- selct() kram ---
    	fd_set stReadFDS; // Socket Menge read
    	struct timeval stTimeOut; // timeout
    	stTimeOut.tv_usec = 1;
    
    	// ----- clear sockets from fds structure
    	FD_ZERO(&stReadFDS);
    	FD_SET(Socket,&stReadFDS);
    
    	// Socket Struktur erstellen
    	sockaddr_in Service; 
    	Service.sin_family = AF_INET;
    	Service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    	Service.sin_port = htons( 5000 );
    
    	sockaddr_in Client;
    	int Client_size = sizeof(Client);
    
    	// --- Socket an die Struktur binden ---
    	if (bind( Socket, (SOCKADDR*) &Service, sizeof(Service)) == SOCKET_ERROR) {
    		cout << "Fehler beim binden" << WSAGetLastError() << endl;
    	}
    
    	// --- Socket auf listen setzen ---
    	if (listen( Socket, SOMAXCONN ) == SOCKET_ERROR)
    		cout << "Fehler bei listen" << WSAGetLastError() << 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 
    		&UDPdwThreadId);   // returns the thread identifier
    
    	int nRet(0);
    	HANDLE TCPThread;
    	DWORD TCPdwThreadId;
    	while(true){
    
    	// ----- clear sockets from fds structure
    	FD_ZERO(&stReadFDS);
    	FD_SET(Socket,&stReadFDS);
    
    		nRet = select(-1,&stReadFDS,NULL,NULL,&stTimeOut);
    		if(nRet == SOCKET_ERROR)
    			cout << "Fehler bei select" << WSAGetLastError() << endl;
    
    		if(nRet != 0 && nRet != SOCKET_ERROR) {
    			if(FD_ISSET(Socket,&stReadFDS) != 0) {
    				// Kommt eine Clien connection an?
    				aSocket = accept( Socket, (SOCKADDR*) &Client, &Client_size );
    				cout << "accept durschlaufen" << 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 
    					&TCPdwThreadId);   // returns the thread identifier
    			}
    		}
    
    	  // Wenn eine Taste gedrückt wurde setze das beenden in gang
    		if(_kbhit()){
    			if(_getch() == 'q'){
    				cout << "q gedrueckt!" << endl;
    				SetEvent(Event);
    				break;		  
    			}
    		}
    	}
    
    	// --- Aufräumen ---
    	closesocket(Socket);
    	closesocket(aSocket);
    	WaitForSingleObject(UDPThread, INFINITE);
    	cout << "hier" << endl;
    	WaitForSingleObject(TCPThread, INFINITE);
    	WSACleanup();
    	cout << "Threadsrun: " << ThreadsRun << endl;
    	return 0;
    }
    


  • Wird er denn überhaupt gestartet?



  • Hat sich erledigt, danke 🙂


Anmelden zum Antworten