Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#7

AW: ICS TWSocket Eingehende Verbindung

  Alt 17. Jun 2014, 07:21
Ein neuer Tag, und kaum geht man neu ausgeruht an die Sache heran, fallen einem gleich die Fehler auf
Nun funktioniert's.

Zur Erklärung: Im OnSessionAvailable wird eine neuen Instanz für die ankommende Session erzeugt
Delphi-Quellcode:
procedure Tfrm_main.ipserverSessionAvailable(Sender: TObject; ErrCode: Word);
var
  mysocket: TSocket;
begin
  if ErrCode <> 0 then exit;
  mysocket:=ipserver.Accept;
  ServerSocket:=TWSocket.Create(nil);
  //Da hier einen neue Instanz von TWSocket erzeugt wird,
  //muß natürlich auch das OnDataAvailable-Ereignis zugeordnet werden,
  //da sonst der Datenempfang nicht festgestell werden kann.
  ServerSocket.OnDataAvailable:=ipserverDataAvailable;
  ServerSocket.OnSessionClosed:=ipserverSessionClosed;
  ServerSocket.OnSessionConnected:=ipserverSessionConnected;
  ServerSocket.OnChangeState:=ipserverChangeState;
  //LineMode,IP und Ports übernehme ich von der Komponente, die auf
  //der Form liegt, da ich dort Veränderungen vornehme, wenn nötig.
  ServerSocket.LineMode:=ServerSocket.LineMode;
  ServerSocket.LineEnd:=ServerSocket.LineEnd;
  ServerSocket.LocalAddr:=ipserver.LocalAddr;
  ServerSocket.Port:=ipserver.Port;
  ServerSocket.Proto:=ipserver.Proto;
  ServerSocket.Dup(mysocket);
  Writelog(False, 'Server Session Available: '+ServerSocket.PeerPort);
end;
dieser müssen natürlich die Ereignisse zugewiesen werden. Das war mein Denkfehler, denn ich dachte er übernimmt diese von der Komponente. Aber klar, woher denn auch. Und letztlich ist das natürlich genial, denn in Abhängigkeit der in OnSessionAvailable zur Verfügung stehenden Daten (z.B. Peer-IP) könnte man unterschiedliche Ereignisbehandlungsroutinen und andere Eigenschaften zuweisen.

Danach empfing ich aber leider nur leere Strings.
Auch hier liegt die Erklärung wieder in der Instanz. Da ich zu Anfang die Ereignisprozeduren für OnDataAvailable nur der Komponente auf der Form zugewiesen habe, habe ich mich beim Auswerten des ReceiveStr diesen auch von dieser geholt. Richtigerweise muss man sich die aber von Sender holen, da es sich ja um einen neue Instanz handelt.
Delphi-Quellcode:
procedure Tfrm_main.ipserverDataAvailable(Sender: TObject; ErrCode: Word);
var
  s: string;
begin
  Writelog(False, 'Server: DataAvailable');
  if ErrCode<>0 then Exit;
  //Wichtig: Mit dem Sender arbeiten
  s:=(Sender as TWSocket).ReceiveStr;
  s:=StringReplace(s,(Sender as TWSocket).LineEnd, '', [rfReplaceAll]);
  if s<>'then
  begin
    //Hier den Emfangenen Text auswerten
    Writelog(True, 'Empfangen: '+s);
  end;
end;
Und schon funktioniert es wie gewünscht. Ich habe ein bischen gebraucht, bis dahinter kam, da der Einstieg auf Grund wenig vorhandener Dokumentation schwierig war.

Für alle die es interessiert und die das nachvollziehen wollen, hab ich mal den Source angehängt.
Vielen Danke für eure Unterstützung.
Angehängte Dateien
Dateityp: rar Client.rar (6,1 KB, 10x aufgerufen)
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat