Zum Inhalt springen

CAsyncSocket (was: Threads mit MFC erzeugen)


Comroader

Empfohlene Beiträge

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 !!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 7 Jahre später...

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast
Dieses Thema wurde nun für weitere Antworten gesperrt.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...