Comroader Geschrieben 15. März 2002 Geschrieben 15. März 2002 Hallo, Ich hab zur Zeit ein großes Problem an dem ich fast verzweifle. Ich versuche mit Sockets ein Chat-Programm für ein kleines Netzwerk zu entwickeln. Die Kommunikation zwischen einem Server und einem Client funktioniert auch schon ganz gut. Wenn nun aber mehrere Clients versuchen mit den Server zu kommunizieren aktzeptiert der Server nur das Accept dannach verabschiedet er sich mit einem Speicherfehler. Das ganze liegt wahrscheinlich daran das man für jeden Client der sich connected einen eigenen Server-Thread erzeugen müsste. Nun kenn ich mich aber überhaupt nicht mit Threads aus und weiß nicht wie ich das realisieren soll. Wenn ich einen Thread erzeuge kommt zwar ein Accept vom Server doch dann kommt keine Kommunikation zwischen Server und Clients zustande. Vielleicht habt Ihr auch schon so ein ähnliches Problem gehabt und könnt mir helfen ! Schon im voraus vielen Dank für eure Bemühungen !!! :confused: Wir sind root wir können das !!!
Klotzkopp Geschrieben 15. März 2002 Geschrieben 15. März 2002 Original geschrieben von Comroader Wenn ich einen Thread erzeuge kommt zwar ein Accept vom Server doch dann kommt keine Kommunikation zwischen Server und Clients zustande.Du musst dem neu erzeugten Thread den Socket Handle mitgeben, den accept zurückgeliefert hat. Poste doch mal den Teil des Quellcodes mit dem accept und der Threaderzeugung.
Crush Geschrieben 15. März 2002 Geschrieben 15. März 2002 CWinThread kapselt CWinApp-Objekte, die man dann als Threads starten kann, nämlich mit: AfxBeginThread CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); oder CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); AfxBeginThread ist für das Erstellen und Ausführen in einem Rutsch. CreateThread für ein (erneutes) Starten, nachdem man schon ein CWinThread erzeugt hat. Indirekt wird das von BeginThread auch mit aufgerufen. Da gibt es auf der MSDN zwei Beispiele: MTGDI und MUTEXES Für Deine Ziele ist die Klasse CAsyncSocket bestimmt ideal, weil die speziell für Multithreading ausgelegt ist. Vielleicht bringt der letzte Satz ganz unten von hier auch noch was: http://www.fachinformatiker-world.de/forums/showthread.php?s=&threadid=19608&highlight=thread
Comroader Geschrieben 15. März 2002 Autor Geschrieben 15. März 2002 Hier ist das Accept und der Worker-Thread: CMySocket m_sConnectSocket; CMySocket m_sListenSocket; UINT MyWorkerThread(LPVOID pParam) { m_sListenSocket.Accept(m_sConnectSocket); return 0; } void CSocketsDlg::OnAccept() { MessageBox("Accept"); //Verbindungsanforderung annehmen AfxBeginThread(MyWorkerThread, this); } Die Funktion OnAccept ist vererbt von der Klasse CAsyncSocket. CMySocket ist der Name der neu eingefügten Klasse CAsyncSocket.
Klotzkopp Geschrieben 15. März 2002 Geschrieben 15. März 2002 Seh ich das richtig? Nach dem Accept startest Du einen Thread, der gleich wieder accept ausführt?
Comroader Geschrieben 15. März 2002 Autor Geschrieben 15. März 2002 Nein, beim Accept soll ein eigener Thread gestartet werden.
Crush Geschrieben 15. März 2002 Geschrieben 15. März 2002 Man sollte doch immer nur ein Socketobjekt mit einem Thread laufen lassen. Dasselbe immer wieder mit neuen Thread zu starten ist gefährlich. MySocketThread sollte ein eigenes Socketobjekt erzeugen und sich merken, damit es wieder gestoppt werden kann.
Klotzkopp Geschrieben 15. März 2002 Geschrieben 15. März 2002 Ich habs grad mal durchgespielt: Wenn Du CAsyncSocket benutzt, brauchst Du keine Threads zu starten, offenbar macht das die MFC unter der Haube. Der Server braucht zunächst einmal einen Socket, mit dem er Create( port ) und Listen aufruft. Der Client braucht einen Socket, mit dem er Create() und Connect( port, "ip" ) aufruft. Der Socket des Servers erhält dann einen OnAccept-Aufruf. Da drin musst Du einen neuen CAsyncSocket erzeugen und mit Accept entgegennehmen. Ich kann Dir das Beispiel schicken, wenn Du möchtest. Ist aber nicht vollständig, ich leake die Sockets und die Daten gehen bisher nur von den Clients zum Server.
Comroader Geschrieben 15. März 2002 Autor Geschrieben 15. März 2002 Bitte, bitte schick mir das Beispiel, vielleicht hab ich irgendwo einen Fehler der mir bisher noch nicht aufgefallen ist. Ich habe aber in der MSDN gelesen das der CAsysncSocket bei der Listen Funktion maximal 5 Connection zulässt !!! Stimmt das ? Meine E-Mail Adresse ist Ben.May@t-online.de
Klotzkopp Geschrieben 15. März 2002 Geschrieben 15. März 2002 CAsyncSocket::Listen erlaubt höchstens 5 wartende Verbindungen, d.h. wenn Du fünf eingehende Verbindungen nicht mit Accept annimmst, wird der jeder weitere Connect abgewiesen.
Comroader Geschrieben 15. März 2002 Autor Geschrieben 15. März 2002 Danke für dein Programm und deine Bemühungen. Fallls es noch Probleme geben sollte, weiß ich ja an wen ich mich wenden muss. Noch ne persönliche Frage zum Schluss: Wie lange programmierst du eigentlich schon, um soviel zu wissen ???
Crush Geschrieben 15. März 2002 Geschrieben 15. März 2002 Gibt es überhaupt eine Möglichkeit mit MFC mehr als 5 Connections zu bekommen? CAsynSocket ist nämlich oberhalb von CSocket in der Vererbungshierarchie. Das kann man wohl nur mit direkter Socketprogrammierung umgehen.
Klotzkopp Geschrieben 16. März 2002 Geschrieben 16. März 2002 Also mein Beispiel funktioniert mit 7 Clients (mehr hab ich nicht getestet). Die 5 ist wohl wirklich nur die Größe der Accept-Warteschlange
registrierenFürNDokument Geschrieben 19. Februar 2010 Geschrieben 19. Februar 2010 Grober Schwachsinn, natürlich kann man beliebig viele Verbindungen mit CSocket oder CAsyncsocket annehmen - wer Englisch kann ist hier ganz klar im Vorteil : http://msdn.microsoft.com/en-us/library/1fzb8082%28VS.80%29.aspx" data-cite="\"http://msdn.microsoft.com/en-us/library/1fzb8082%28VS.80%29.aspx"> Listen attempts to continue to function rationally when there are no available ports (descriptors). It will accept connections until the queue is emptied. If ports become available, a later call to Listen or Accept will refill the queue to the current or most recent "backlog," if possible, and resume listening for incoming connections.
Klotzkopp Geschrieben 19. Februar 2010 Geschrieben 19. Februar 2010 wer Englisch kann ist hier ganz klar im Vorteil :Wer Datumsangaben lesen kann, auch. Wenn du schon einen fast 8 Jahre alten Thread ausgräbst, dann solltest du wenigstens etwas Neues beitragen .
Empfohlene Beiträge