Server und Client (CSocket)

NinjaOne

Erfahrenes Mitglied
Hallo, mal wieder !
Hab da mal ne Frage. Hab mir ei Programm geschrieben, daß über CSocket mit einem anderen verbindung aufnehemen kann. Wahlweise kann man zwischen Server und Client wählen.
Das klappt auch alles sehr gut.

Hier kommt nun mein Problem:
Wenn zwei Clients oder auch mehr auf den Server zugreifen wollen stürzt das Programm ab. Muß ich für jeden Client eine andrere Portnummer vergeben, oder reicht eine ?

Schon mal danke!

PS: Wenn jemand den Quellcode haben möchte, nur anfragen !
 
hi,

du brauchst deshalb natürlich keine neue Portnummer. Sonst würde ja auch zb: iCQ nicht funktionieren.
Es gibt verschiedene Lösungen für dein Problem, aber in etwa kannst du das so machen:

server:
Code:
socket1
socket2
connect (socket1);
listen (socket1);
if (client connectet sich mit socket 1)
{
 connect (socket2);
 listen(socket2);
}
...
socket1.close;
socket2.close;
Ein problem gilt es bei der lösung aber noch zu beachten.
"listen" blockiert den Prozess.dh wenn dein Programm auf einen connect wartet (listen)
läuft dein programm nicht weiter. Das kann man unterschiedlich lösen:

1. Mit threads
2. die Klasse CAsyncsocket nutzt virtuelle Funktionen die Messages behandelt oder
3. Fork().Da wird eine identische Kopie vom Prozess angelegt, Kindprozess (weiss net ob das auch in Windows geht)

Sorry das ich das in pseudo-Code geschrieben hab, aber ich hab zZ nicht die möglichkeiten meine Unterlagen durchzuschauen.Ich schick dir so bald wie möglich ein Beispiel.

PS: Schick doch mal dein code.
Mfg Col.Blake
 
Zuletzt bearbeitet:
Hi,
hier nun der versprochene Code. Ist aber mit Hilfe der Klasse CAsyncsocket gemacht worden.Dazu brauchen wir auf der Seite des Servers 2 Klassen (lässt sich besser machen).

Klasse 1: "CMySocket" ist dafür zuständig,die Anfragen der Clients anzunehmen und weiter zu leiten, indem die virtuelle funktion OnAccept der Klasse CAsyncSocket überschrieben wird.

Code:
class CMySocket:public CAsyncSocket
{
 char data[BLOCKSIZE];
 CClSocket *ClientList[9];                          //max 10 Clients können connecten
 ClientCount;
 void OnAccept(...);
}

void CMySocket::OnAccept(...)
{
 // dem ClSocket wird ein Zeiger auf CMySocket übergeben.Dadurch ist er
 // zB. in der Lage sich selbst aus der ClientList auszutragen :) ;
 CClSocket *cls=new CClSocket (this); 

 Accept (*cls,NULL,NULL);      //Client wird verbunden
 ClientList[ClientCount] = cls;  //Client wird in die Liste eingetragen
 ClientCount++;
}
Klasse 2: "CClSocket" .Jeder verbundene Client bekommt ein Object dieser Klasse.
So kann man die Clients einzeln haendeln.
Code:
class CClSocket:public CAsyncSocket
{
 CMySocket *server;
 CClSocket (CMySocket *s);
 void OnClose();     //wenn der Client die Verbindung Unterbricht ( muss du noch machen )
 void OnRecive();    //wenn eine Nachicht ankonnt  ( muss du noch machen )
 void OnSend();      //wenn du sendest ( muss du noch machen )
 void 
}
CClSocket::CClSocket (CMySocket *s)
  {
    server= s; 
  }
Soviel zur Vorarbeit. Nun zum eigendlichen Code des Servers:
Code:
...
CMySocket s;
s.Create(20000)  //20000= listen port
s.Listen();
..
s.Close();
Wie du die Clients machst ist eigendlich egal. Du kannst also deine nehmen.
Was noch zu machen ist :
Die virtuellen Funktionen OnResive(),OnSend(),OnClose(),... behandeln.
siehe MSDN

PS: Code ist nicht von mir,also spart euch euer Lob ;)

Mfg Col.Blake
 
Zuletzt bearbeitet:
CAsyncSocket initialisieren

Hi,

ich habe eine Klasse, die von CAsyncSocket erbt und als Client gedacht ist. Wenn ich
ich sie so initialisieren will:
Code:
CCentralLogClient *pClient = new CCentralLogClient();
,

erhalte ich folgende Fehler:
Kein Zugriff auf "new", da "CAsyncSocket" "'public" verwendet, um von "CObject" zu erben
Kein Zugriff auf "delete", da "CAsyncSocket" "'public" verwendet, um von "CObject" zu erben

mein Server-Klasse erbt aber auch von CAsyncSocket und da tritt dieses Problem nicht auf... :confused:

Wär für Hilfe sehrsehrsehr dankbar....

Grüßle
Marei

edit: Satzstellung hat keine der gehabt Satz :rolleyes:
 
Ersteinmal danke für eure Antworten !

Ich habe mein Problem soweit gelöst.

Abbreviation, ich habs bei mir mal ausgetestet
CCentralLogClient *pClient = new CCentralLogClient();
habe aber keine Fehlermeldung bekommen.

Zeige doch mal etwas mehr von deiner Classe.

Bye, Sascha.
 
Naja, meine Klasse (CCentralLogClient) erbt von einer Klasse, die protected von CAsyncSocket erbt. Ob meine Klasse public oder protected erbt macht dabei scheinbar keinen Unterschied.... :confused:

Grüßle
Marei

edit: Hab jetzt rausgefunden, dass man wohl im Konstruktor noch keine Verbindung öffnen sollte... :-( Danke nochmal @NinjaOne

edit2: Sehr seltsam, ich hab das aus dem ersten edit geändert. Wenn man logisch überlegt sollte das wohl keinen Unterschied machen. Tut es aber: Fehlermeldung weg, Programm läuft durch.
Nur wenn ich in der Implementierungsdatei der Klasse, in der ich diese Initialisierung mache (so wie oben) etwas ändere, und sei es auch nur einen Zeilenkommentar einfügen, dann krieg ich wieder diese Fehlermeldung ... Naja. Irgendwas scheint da ziemlich zu spinnen, ich wollte meinen ersten edit nur "rechtfertigen" und werd wohl einfach noch mal alles neu machen.... Danke für eure Hilfe, nochmal und Verzeihung für das Chaos...

edit3: Dreimal ist Bremer Recht oder wie war das.... nun ja, also offensichtlich lag das Problem bei mir daran, dass der Compiler den völlig falschen Konstruktor verwendet hat. mit ::new geht jetzt alles. Danke nochmal und nochmal für eure Hilfe und Verzeihung für das Chaos...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück