dickes prob mit threads für clients
-
hallo,
ich hab mal wieder en problem.
ich möchte einen server schreiben, der mehrere clients auf einmal verarbeiten kann...
ich nehme allerdings die konstellation csocket mit carchive, also kann ich casyncsocket, dass die threads erzeugen würde, nicht verwenden
nun will ich mir das selber schreiben
folgendes:bei jedem onAccept-Aufruf passiert folgendes
void CPort5311Dlg::OnAccept() { mp_thrClient = new CDynThread(); mp_thrClient->starten(); mp_thrClient->SetParent(this); Logging("Server akzeptiert und bestätigt Verbindung zum Client."); m_ctlBestaetingenButton.EnableWindow(); } #include "StdAfx.h" #include "dynthread.h" CDynThread::CDynThread(void) { } BOOL CDynThread::OnInitDialog() { CDialog::OnInitDialog(); //AfxMessageBox("Hallo"); // Hinzufügen des Menübefehls "Info..." zum Systemmenü. return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } void CDynThread::SetParent(CDialog *pWnd) { // Elementzeiger setzen m_pWnd = pWnd; } CDynThread::~CDynThread(void) { } //////////////////////////CLIENT WIRD ABGEFRAGT - START//////////////////////////////////////////////// UINT CDynThread::thrThread(LPVOID pParam) { CDynThread* pDlg = (CDynThread*) pParam; AfxMessageBox("Bin am prüfen"); while (1) { pDlg->mp_ArIn; } } //////////////////////////CLIENT WIRD ABGEFRAGT - ENDE/////////////////////////////////////////////// void CDynThread::starten() { mp_myCurSock = new CMySocket(); (*mp_myCurSock).SetParent(this); //mp_myCurSock->SetParent(pWnd); mp_SocketFile = new CSocketFile(mp_myCurSock); //hier gibt es den fehler mp_ArIn = new CArchive(mp_SocketFile,CArchive::load); mp_ArOut = new CArchive(mp_SocketFile,CArchive::store); AfxBeginThread(thrThread,this, THREAD_PRIORITY_NORMAL); } #pragma once #include "afxwin.h" #include "Afx.h" #include "MySocket.h" #include "afxcmn.h" #include "conio.h" #include "windows.h" class CDynThread : public CDialog { private: CDialog* m_pWnd; public: void SetParent(CDialog* pWnd); CDynThread(void); static UINT thrThread(LPVOID pParam); ~CDynThread(void); CSocketFile* mp_SocketFile; CArchive* mp_ArIn; CArchive* mp_ArOut; void starten(); CMySocket* mp_myCurSock; protected: virtual BOOL OnInitDialog(); };
kann es sein, dass irgendwein parent-fenster falsch ist oder waoran liegt das ???
-
Hab jetzt den Source nicht gelesen, aber soweit ichs sehe ist da kein Problem angegeben
-
das_brot schrieb:
Hab jetzt den Source nicht gelesen, aber soweit ichs sehe ist da kein Problem angegeben
doch, irgendwo im code steht die zeile:
"mp_SocketFile = new CSocketFile(mp_myCurSock); //hier gibt es den fehler"musste auch ne halbe stunde suchen...
Esco
-
jetzt hab' ich mir doch noch paar gedanken drueber gemacht: was sagt denn dein socketfile konstruktor dazu, dass du ihm gar kein CSocket-Objekt uebergibst, sondern wohl eine instanz einer davon abgeleiteten klasse?! versuchs doch mal mit einem CSocket-Objekt.
Esco
-
ja, hab ic hgemacht, klappt, löst jedoch nich mein prob :-\
-
ess iss so:
ich hab ne reihe von clients, die akzeptiert worden sind, aufm server...
wenn jetzt server x etwas sendet, dann wird die OnReceive()-Methode aufgerufen...um jetzt mit das richtig Archiv zu erhalten, dass zu dem Server passt, muss ich nun wissen, welcher client-socket die onreceive version aufgerufen hat
es ist doch so, dass OnReceive() von dem Socket aufgerufen wird, wenn dieser etwas empfängt
-
Ja.