008
27.06.2003, 18:45 Uhr
Dirk22
|
@ao: Ja, genau so habe ich es gemeint.
Klasse1 = CTcpSocket Klasse2 = CTcpListenSocket Hauptklasse = CSenden
TcpSocket.h
C++: |
#if !defined(AFX_TCPSOCKET_H__79D77B93_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_) #define AFX_TCPSOCKET_H__79D77B93_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // TcpSocket.h : Header-Datei //
///////////////////////////////////////////////////////////////////////////// // Befehlsziel CTcpSocket
class CTcpSocket : public CAsyncSocket { // Attribute public:
// Operationen public: CTcpSocket(); virtual ~CTcpSocket();
// Überschreibungen public: // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(CTcpSocket) //}}AFX_VIRTUAL
// Generierte Nachrichtenzuordnungsfunktionen //{{AFX_MSG(CTcpSocket) // HINWEIS - Der Klassen-Assistent fügt hier Member-Funktionen ein und entfernt diese. //}}AFX_MSG
// Implementierung protected: virtual void OnClose(int nErrorCode); virtual void OnAccept(int nErrorCode); };
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
#endif // AFX_TCPSOCKET_H__79D77B93_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_
|
TcpSocket.cpp
C++: |
// TcpSocket.cpp: Implementierungsdatei //
#include "stdafx.h" #include "Test.h" #include "TcpSocket.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // CTcpSocket
CTcpSocket::CTcpSocket() { }
CTcpSocket::~CTcpSocket() { }
//Die folgenden Zeilen nicht bearbeiten. Sie werden vom Klassen-Assistenten benötigt. #if 0 BEGIN_MESSAGE_MAP(CTcpSocket, CAsyncSocket) //{{AFX_MSG_MAP(CTcpSocket) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif // 0
///////////////////////////////////////////////////////////////////////////// // Member-Funktion CTcpSocket
void CTcpSocket::OnAccept(int nErrorCode) { }
void CTcpSocket::OnClose(int nErrorCode) { // Are there some errors? if (nErrorCode == 0) { // If not, close the connection Close(); } }
|
TcpListenSocket.h
C++: |
// TcpListenSocket.h: Schnittstelle für die Klasse CTcpListenSocket. // //////////////////////////////////////////////////////////////////////
#if !defined(AFX_TCPLISTENSOCKET_H__79D77B94_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_) #define AFX_TCPLISTENSOCKET_H__79D77B94_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#include "TcpSocket.h"
class CTcpListenSocket : public CTcpSocket { public: void setConnectSocket(CTcpSocket* secondSocket); CTcpListenSocket(); virtual ~CTcpListenSocket();
protected: virtual void OnAccept(int nErrorCode); private: CTcpSocket* connectSocket; };
#endif // !defined(AFX_TCPLISTENSOCKET_H__79D77B94_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_)
|
TcpListenSocket.cpp
C++: |
// TcpListenSocket.cpp: Implementierung der Klasse CTcpListenSocket. // //////////////////////////////////////////////////////////////////////
#include "stdafx.h" #include "TcpListenSocket.h"
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion //////////////////////////////////////////////////////////////////////
CTcpListenSocket::CTcpListenSocket() {
}
CTcpListenSocket::~CTcpListenSocket() {
}
void CTcpListenSocket::setConnectSocket(CTcpSocket* secondSocket) { connectSocket = secondSocket; }
//Dieses Ereignis wird ausgelöst, wenn ein //Client eine Verbindung anfordert void CTcpListenSocket::OnAccept(int nErrorCode) { if (nErrorCode == 0) //wenn kein Fehler { //die Verbindungsanforderung vom Client wird akzeptiert Accept(*connectSocket); } }
|
Senden.h
C++: |
// Senden.h: Schnittstelle für die Klasse CSenden. // //////////////////////////////////////////////////////////////////////
#if !defined(AFX_SENDEN_H__79D77BA9_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_) #define AFX_SENDEN_H__79D77BA9_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#include "TcpSocket.h" #include "TcpListenSocket.h"
class CSenden { public: int getErrorCode(); void send(char* pnmea_frame_gga, char* pnmea_frame_xdr); void close(); void open(); void Init(int port); CSenden(); virtual ~CSenden();
private: int socketPort; CTcpListenSocket* m_listenSocket; CTcpSocket* m_connectSocket; void sendNmeaData(char* pnmea_frame);
};
#endif // !defined(AFX_SENDEN_H__79D77BA9_9BD4_11D7_BFA5_00B0D02125BB__INCLUDED_)
|
C++: |
// Senden.cpp: Implementierung der Klasse CSenden. // //////////////////////////////////////////////////////////////////////
#include "stdafx.h" #include "Senden.h"
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion //////////////////////////////////////////////////////////////////////
CSenden::CSenden() { }
CSenden::~CSenden() {
}
////////////////////////////////////////////////////////////////////// // eigene Methoden //////////////////////////////////////////////////////////////////////
void CSenden::Init(int port) { socketPort = port; m_connectSocket = new CTcpSocket; m_listenSocket = new CTcpListenSocket; m_listenSocket->setConnectSocket(m_connectSocket); }
int CSenden::getErrorCode() { return m_connectSocket->GetLastError(); }
void CSenden::open() { m_listenSocket->Create(socketPort); m_listenSocket->Listen(); }
void CSenden::close() { m_listenSocket->Close(); m_connectSocket->Close(); delete m_listenSocket; delete m_connectSocket; }
void CSenden::send(char* pnmea_frame_gga, char* pnmea_frame_xdr) { sendNmeaData(pnmea_frame_gga); sendNmeaData(pnmea_frame_xdr); }
void CSenden::sendNmeaData(char* pnmea_frame) { int len = 300; int sent; char NmeaMsg[300];
strcpy(NmeaMsg, pnmea_frame); //Zu sendende Nachricht vorhanden if (NmeaMsg != "") { //Länge der Nachricht ermitteln len = strlen(NmeaMsg); //Nachricht senden sent = m_connectSocket->Send(LPCTSTR(NmeaMsg),len); //Konnte die Nachricht gesendet werden? if (sent == SOCKET_ERROR) { } } }
|
Dies sind meine Klassen. Bisher ist es so, dass wenn eine Verbindung zwischen einem Client und dem Server(meine Anwendung) besteht und dann ein weiterer Client versucht sich ebenfalls mit meiner Anwendung zu connecten, dass dann meine Anwendung abstürzt. Nun hatte ich die Idee dieses Problem mit Hilfe einer booleschen Variablen zu lösen. Das Problem ist nur, dass ich in der Klasse CSenden 2 Objekte erstelle (eins von CTcpSocket und eins von CTcpListenSocket). Und die Ereignisfunktion OnAccept(), die aufgerufen wird, wenn der Client eine Verbindungsanforderung stellt steht in der Klasse CTcpListenSocket. Und die Funktion, die aufgerufen wird, wenn der Client die Verbindung beendet, steht in TcpSocket. Und in OnAccept von TcpListenSocket wollte ich folgendes tun:
C++: |
void CTcpListenSocket::OnAccept(int nErrorCode) { if (nErrorCode == 0) //wenn kein Fehler { if (boolesche Variable) { //tue nichts } else { //die Verbindungsanforderung vom Client wird akzeptiert Accept(*connectSocket); boolesche Variable = true; } }
|
Und in der Ereignisfunktion OnClose() der Klasse CTcpSocket wird diese dann auf false gesetzt.
C++: |
void CTcpSocket::OnClose(int nErrorCode) { // Are there some errors? if (nErrorCode == 0) { // If not, close the connection Close(); boolesche Variable = false; } }
|
Ganz am Anfang muss diese boolesche Variable ja noch mit false initialisiert werden. Das Problem bei der ganzen Sache ist nun, dass ich es schaffen muss in beiden Funktionen, die ja unterschiedlichen Klassen angehören wirklich dieselbe Variable zu benutzen. Diese boolesche Variable soll mir immer anzeigen, wenn ein Client mit meinem Server verbunden ist und wann nicht. Deshalb kam mir die Idee, diese boolesche Variable in der Klasse CSenden unterzubringen. Und die beiden Klassen darauf zugreifen zu lassen.
Ich bin mal gespannt, was ihr für ein neues Design vorschlagt. Eigentlich ist das Ganze ja ein allgemeines Problem. Aber es ist halt sehr viel MFC drin. Ich hoffe, dass das Posting dann hier noch richtig ist.
Vielen Dank für eure Hilfe im Voraus
Dirk Dieser Post wurde am 27.06.2003 um 19:51 Uhr von FloSoft editiert. |