thekiller
Viceinator
Hallo,
ich möchte mir eine eigene Klasse schreiben, die den gesamten Netzwerkbereich meines Programmes abdeckt.
Bisher habe ich die Klasse so weit, dass die Verbindung von einem Client akzeptiert werden kann, funktioniert auch alles wunderbar.
Dann wollte ich sie so erweitern, dass mehrere Clients mit dem Server verbinden können. Ich habe die Variante mit Threads versucht, da ich die eh verwenden wollte in meinem Programm. Mein Problem ist nun, dass mein Programm beim 2. aufruf von Accept immer abstürzt. Nehme an ich hab irgendwo in der ganzen Sache etwas falsch verstanden.
Kann mir vielleicht jemand mal genau erklären wie genau es aussehen muss, damit ein 2. Client verbinden kann? Wie muss der Aufruf von accept aussehen? Wie wähle ich den Client aus zu dem später Daten gesendet oder empfangen werden usw.
Wäre echt genial! Danke schonmal im Voraus!
So habe ich es bisher gemacht:
1. Instanz meiner Klasse Global deklariert
2. In Haupt-Thread Server Socket erstellt über Methode meiner Klasse
3. In Haupt-Thread Methode aufrufen die mit Accept wartet
4. Wenn Accept erfolgreich war neuen Thread starten
5. Im neuen Thread 2. mal Methode aufrufen die mit Accept wartet <- ABSTURZ
Ach was solls, hier mal das wichtigste aus meinem Source. Aber nicht wundern warum kaum Sicherheitsabfragen drin sind, is ja erstmal alles noch zum herstellen der eigentlichen Funktionalität und zum testen. Daher auch printf-debuggen^^
MFCMain.h(MFCMain wird in _tmain aufgerufen, also Win32-Console-App mit MFC):
MFCMain.cpp
MFCSocket.h:
MFCSocket.cpp:
Hoffe Ihr seht einigermaßen durch^^
LG Manuel
ich möchte mir eine eigene Klasse schreiben, die den gesamten Netzwerkbereich meines Programmes abdeckt.
Bisher habe ich die Klasse so weit, dass die Verbindung von einem Client akzeptiert werden kann, funktioniert auch alles wunderbar.
Dann wollte ich sie so erweitern, dass mehrere Clients mit dem Server verbinden können. Ich habe die Variante mit Threads versucht, da ich die eh verwenden wollte in meinem Programm. Mein Problem ist nun, dass mein Programm beim 2. aufruf von Accept immer abstürzt. Nehme an ich hab irgendwo in der ganzen Sache etwas falsch verstanden.
Kann mir vielleicht jemand mal genau erklären wie genau es aussehen muss, damit ein 2. Client verbinden kann? Wie muss der Aufruf von accept aussehen? Wie wähle ich den Client aus zu dem später Daten gesendet oder empfangen werden usw.
Wäre echt genial! Danke schonmal im Voraus!
So habe ich es bisher gemacht:
1. Instanz meiner Klasse Global deklariert
2. In Haupt-Thread Server Socket erstellt über Methode meiner Klasse
3. In Haupt-Thread Methode aufrufen die mit Accept wartet
4. Wenn Accept erfolgreich war neuen Thread starten
5. Im neuen Thread 2. mal Methode aufrufen die mit Accept wartet <- ABSTURZ
Ach was solls, hier mal das wichtigste aus meinem Source. Aber nicht wundern warum kaum Sicherheitsabfragen drin sind, is ja erstmal alles noch zum herstellen der eigentlichen Funktionalität und zum testen. Daher auch printf-debuggen^^
MFCMain.h(MFCMain wird in _tmain aufgerufen, also Win32-Console-App mit MFC):
C++:
#ifndef _MFCMAIN_H
#define _MFCMAIN_H
#include "MFCSocket.h"
using namespace std;
BOOL MFCMain();
#endif
MFCMain.cpp
C++:
#include "stdafx.h"
#include "MFCMain.h"
UINT ThreadProc(LPVOID pParam) {
cout << "Das hier is der Thread" << endl;
cout << "Thread: Warte auf verbindung vom Client" << endl;
if(MFCSocketServer.WaitForNewClient() == 0) { // Absturz
cout << "Thread: Anzahl maximaler Clients wurde schon erreicht" << endl;
system("PAUSE");
return 0;
}
cout << "Thread: Client hat verbunden" << endl;
return 0;
}
BOOL MFCMain() {
// Deklaration
CWinThread *Thread;
UINT uiPort;
// Initialisierung Server
uiPort = 50000;
cout << "Server starten auf Port: " << uiPort << endl;
MFCSocketServer.OpenServer(uiPort);
cout << "Warte auf verbindung vom Client" << endl;
if(MFCSocketServer.WaitForNewClient() == 0) {
cout << "Anzahl maximaler Clients wurde schon erreicht" << endl;
system("PAUSE");
return 0;
}
cout << "Client hat verbunden" << endl;
Thread = AfxBeginThread(ThreadProc, NULL);
WaitForSingleObject(Thread, INFINITE);
system("PAUSE");
return true;
}
MFCSocket.h:
C++:
#ifndef _MFCSOCKET_H
#define _MFCSOCKET_H
#include <afxsock.h>
class MFCSocket {
private:
// Deklaration
CSocket *pCSocketServer;
CSocket *pCSocketClient;
UINT uiMaxClients;
UINT uiNumClients;
BOOL isServer;
BOOL isOpen;
UINT uiPort;
public:
// Methoden
MFCSocket();
~MFCSocket();
BOOL OpenServer(UINT _uiPort = 50000);
UINT WaitForNewClient();
VOID Close();
};
extern MFCSocket MFCSocketServer;
#endif
MFCSocket.cpp:
C++:
#include "stdafx.h"
#include "MFCSocket.h"
// Methoden
MFCSocket::MFCSocket() {
// Initialisierung
AfxSocketInit();
this->uiMaxClients = 32;
this->uiNumClients = 0;
this->isServer = false;
this->isOpen = false;
this->uiPort = 50000;
this->pCSocketServer = new CSocket;
this->pCSocketClient = new CSocket[this->uiMaxClients];
}
MFCSocket::~MFCSocket() {
}
// Einen Server öffnen
BOOL MFCSocket::OpenServer(UINT _uiPort) {
// prüfen ob schon eine Server/Client Verbindung besteht
if(this->isOpen) {
// es besteht bereits eine Verbindung
// ABBRUCH
return false;
}
this->uiPort = _uiPort;
// Server erstellen
this->pCSocketServer->Create(this->uiPort);
this->pCSocketServer->Bind(this->uiPort);
this->pCSocketServer->Listen();
this->isOpen = true;
this->isServer = true;
return true;
}
UINT MFCSocket::WaitForNewClient() {
// Prüfe ob maximale Anzahl an Clients erreicht wurde
if(this->uiNumClients >= this->uiMaxClients) {
return 0;
}
// Warte auf Clientverbindung
while(1) {
if(this->pCSocketServer->Accept(this->pCSocketClient[this->uiNumClients])) {
break;
}
Sleep(10);
}
//this->pCSocketSocket->Accept(*this->pCSocketConnection);
this->uiNumClients++;
return this->uiNumClients;
}
VOID MFCSocket::Close() {
}
MFCSocket MFCSocketServer;
Hoffe Ihr seht einigermaßen durch^^
LG Manuel
Zuletzt bearbeitet von einem Moderator: