![]() |
Socket.ReceiveText
moin, erstmal der code:
Delphi-Quellcode:
das OnClientConnect event klappt ohne probleme, allerdings sobald was gesendet wird (von externen programm, kein eigenes) und OnClientRead ausgelöst wird kriege ich folgenden winsock error:
program ProgSock;
{$APPTYPE CONSOLE} uses SysUtils, forms, ScktComp; type TCustomSrv = Class(TServerSocket) private fertig: boolean; public procedure OCC(Sender: TObject; Socket: TCustomWinSocket); procedure OCR(Sender: TObject; Socket: TCustomWinSocket); end; var srv: TCustomSrv; procedure TCustomsrv.OCC(Sender: TObject; Socket: TCustomWinSocket); begin WriteLn('Connected'); //fertig := true; end; procedure TCustomsrv.OCR(Sender: TObject; Socket: TCustomWinSocket); var MSG: String; begin WriteLn('-> '+Srv.Socket.ReceiveText); end; begin try application.initialize; application.run; Srv := TCustomSrv.Create(nil); Srv.Port := 3724; Srv.OnClientConnect := srv.OCC; Srv.OnClientRead := srv.OCR; Srv.Active := True; Srv.Open; except WriteLn('error'); end; repeat //Writeln('WAITING FOR CONNECTION...'); Sleep(1); application.processmessages; until srv.fertig; end. Zitat:
|
Re: Socket.ReceiveText
Hi,
dein Fehler steckt hier:
Delphi-Quellcode:
es muß so aussehen:
procedure TCustomsrv.OCR(Sender: TObject; Socket: TCustomWinSocket);
var MSG: String; begin WriteLn('-> '+[b]Srv.Socket.ReceiveText[/b]); end;
Delphi-Quellcode:
Gruß oki
procedure TCustomsrv.OCR(Sender: TObject; Socket: TCustomWinSocket);
var MSG: String; begin WriteLn('-> '+ Socket.ReceiveText); end; |
Re: Socket.ReceiveText
Nochwas:
Delphi-Quellcode:
Diese beiden Zeilen machen beide das gleiche. Eine davon reicht also aus.
Srv.Active := True;
Srv.Open;
Delphi-Quellcode:
Die Sockets sind nicht umsonst event-driven, d.h. sie geben dir Bescheid, wenn was zu tun ist. Daher ist es unverständlich diesen Vorteil wieder auszumerzen in dem man wieder auf polling (ständiges abfragen in einer Schleife) zurück kommen sollte. Wenn, dann erzeuge ein Event wenn er fertig ist und mache entsprechende Aktionen.
repeat
//Writeln('WAITING FOR CONNECTION...'); Sleep(1); application.processmessages; until srv.fertig; |
Re: Socket.ReceiveText
spitze, vielen dank euch beiden :D
@Muetze1: wie sähe sowas aus? ich habe gestern den ganzen tag probiert nach diversen forum post, aber nur beim oben geposteten code funktionieren die events wirklich :-/ (irgendwie schaff ichs nicht events in der konsole richtig zu nutzen...) |
Re: Socket.ReceiveText
*push* :-/
|
Re: Socket.ReceiveText
Ok, du hängst also in der Konsole, da brauchst du natürlich eine Schleife. Ich würde dort aber die Schleife unabhängig von den Sockets machen und nur so lange laufen lassen, bis die gesamte Verarbeitung abgeschlossen ist. Entweder du setzt ein Event (TEvent oder direkt per WinAPI) oder du nimmst den einfachen Weg über eine globale Variable. Innerhalb der Schleife ist dein bisheriger Schleifeninhalt schon ok. Ich würde aber die Sleep() Zeit höher setzen. Eine 1 Millisekunden Pause (bzw. Abgabe) bringt nicht viel. Eine Abgabe von 50 bis 100 ms sind wohl besser.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz