AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Socket.ReceiveText

Ein Thema von Snoke · begonnen am 20. Sep 2006 · letzter Beitrag vom 21. Sep 2006
Antwort Antwort
Snoke

Registriert seit: 10. Aug 2006
16 Beiträge
 
Delphi 2006 Professional
 
#1

Socket.ReceiveText

  Alt 20. Sep 2006, 06:07
moin, erstmal der code:

Delphi-Quellcode:
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.
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:

Zitat:
Windows socket error: Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde (10057), on API 'recv'
für jegliche hilfe und verbesserungen zum code bin ich sehr dankbar
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Socket.ReceiveText

  Alt 20. Sep 2006, 07:07
Hi,

dein Fehler steckt hier:

Delphi-Quellcode:
procedure TCustomsrv.OCR(Sender: TObject; Socket: TCustomWinSocket);
var
  MSG: String;
begin
  WriteLn('-> '+[b]Srv.Socket.ReceiveText[/b]);
end;
es muß so aussehen:
Delphi-Quellcode:
procedure TCustomsrv.OCR(Sender: TObject; Socket: TCustomWinSocket);
var
  MSG: String;
begin
  WriteLn('-> '+ Socket.ReceiveText);
end;
Gruß oki
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Socket.ReceiveText

  Alt 20. Sep 2006, 11:36
Nochwas:

Delphi-Quellcode:
    Srv.Active := True;
    Srv.Open;
Diese beiden Zeilen machen beide das gleiche. Eine davon reicht also aus.

Delphi-Quellcode:
  repeat
    //Writeln('WAITING FOR CONNECTION...');
    Sleep(1);
    application.processmessages;
  until srv.fertig;
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.
  Mit Zitat antworten Zitat
Snoke

Registriert seit: 10. Aug 2006
16 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Socket.ReceiveText

  Alt 20. Sep 2006, 16:45
spitze, vielen dank euch beiden

@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...)
  Mit Zitat antworten Zitat
Snoke

Registriert seit: 10. Aug 2006
16 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Socket.ReceiveText

  Alt 21. Sep 2006, 05:18
*push* :-/
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Socket.ReceiveText

  Alt 21. Sep 2006, 11:42
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz