Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

Geschrieben

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 :D

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

  • 7 Jahre später...
Geschrieben

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.

Geschrieben
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 ;).

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