Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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

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.

Nein, beim Accept soll ein eigener Thread gestartet werden.

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.

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.

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

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

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

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.

.....

Gast
Dieses Thema ist für weitere Antworten geschlossen.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.