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
