Daten an laufenden Thread übergeben
-
Hallo Leute,
ich bin derzeit fleißig am proggen, auch wenn mir die MSDN in ihrer Erklärung und Sucherei öfters Kopfschmerzen bereitet. Ich bin gerade bei Sockets und Threads. Ich habe einen Thread erfolgreich erstellt, auf den zugegriffen und anschließend ein bestimmer Port gepollt wird. Dadurch kann im "main"-Thread normal weitergearbeitet werden, währenddessen Clients ihre Daten an den Server senden können.
Mein Problem ist, wenn ich den Thread schließen will und davor oder danach mit closesocket und WSACleanup den Socket beenden möchte, dass sich das Programm aufhängt. Es passiert nichts mehr und muss über das X geschlossen werden.Wenn ich closesocket und WSACleanup weglasse und nur CloseHandle() verwende funktionierts. auch über netstat -a wird der Port nicht mehr angezeigt, aber ich habe mal gelesen dass diese Methode "unsauber" ist...
Vielleicht könnten mir ja die Experten aus diesem Forum weiter helfen

Mal eine andere Frage noch: Wie kann man einen Thread in einer Endlosschleife dazu bewegen diese zu verlassen?
ich habe euch mein Serverprog angehängt:
#include "stdafx.h" #include <iostream> #include <string> #include <winsock2.h> using namespace std; DWORD WINAPI thread(LPVOID lpParam) { SOCKET sockStart = (SOCKET)lpParam; SOCKET sockrecvdata; int max_data = 500; char recv_data[500]; cout << "Das ist das Serverprog" << endl; cout << "----------------------" << endl; listen(sockStart,0); while(true) { sockrecvdata = accept(sockStart, NULL, NULL); if(sockrecvdata == INVALID_SOCKET) { cout << "Es hat nicht funktioniert! " << endl; } recv(sockrecvdata, recv_data,max_data,0); cout << recv_data << endl; } return 0; } int main(int argc, char **argv) { SOCKET sockStart; WSADATA wsa; int WSAresult; if((WSAresult = WSAStartup(MAKEWORD(2,2),&wsa)) != 0) { cout << "Socket konnte nicht initialisiert werden!"; } if((sockStart = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL, 0, NULL))== INVALID_SOCKET) { cout << "Socket konnte nicht erstellt werden!\nFehlernummer: " << WSAGetLastError() << endl; } sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = INADDR_ANY; service.sin_port = htons(27015); if((bind(sockStart,(SOCKADDR*)&service,sizeof(service))) == SOCKET_ERROR) { cout << "Fehler beim binden an Socket" << endl; } HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, (LPVOID)sockStart, 0, 0); cin.get(); closesocket(sockStart); WSACleanup(); CloseHandle(hThread); cin.get(); return 0; }Für alle Infos (Kritik / Lob) bin ich gerne offen!

Vielen Dank!
-
Warum baust Du keinen Code ein, der den Thread veranlasst sich selbst zu beenden.
Anmerkung zu Deinem Code:
1. Was soll dercast in CreateThread. Wenn der Compiler Dene Funktion anmotzt dann korrigiere die Signatur.
2. CreateThread is falsch, benutzt _beginthreadex
http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/
http://blog.m-ri.de/index.php/2008/02/28/afxbeginthread-versus-_beginthreadex/
3. Zudem verschoben nach WinAPI. Das hat nichts mit MFC zu tun.
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.