Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi bind() in console application (https://www.delphipraxis.net/182980-bind-console-application.html)

Lyan 1. Dez 2014 17:22

bind() in console application
 
Hallo,

ich würde gerne einen Client auf 0.0.0.0:9000 lauern lassen.
Nachdem ich das UDP-Socket erstellt habe und via bind auf den Port gebunden habe, stellt sich für mich noch die Frage wie ich das mit den Messages mache.

Habe eine Funktion:

procedure TClientClass.SocketMessage(var msg: TMessage);

in der ich auch recvFrom calle.

Diese sollte die msg abfangen, bzw. die routine soltle zumidnest gecallt werden oder?

Meine Main, sieht dann so aus:

Code:
var
  ClientClass : TClientClass;
  Msg: TMsg;
  bRet: Integer;

begin
  ClientClass := TClientClass.Create;
  repeat
    bRet := Integer(GetMessage(Msg, 0, 0, 0));

    if bRet = -1 then
    begin
      // error
      Break;
    end
    else
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  until bRet = 0;
end.

Ich denke mal das Problem liegt an TMEssage und TMsg, oder?
Danke im voraus :)

Luckie 2. Dez 2014 07:44

AW: bind() in console application
 
Ähm, bekommen Konsolenanwendungen überhaupt Windows Nachrichten?

Delphi-Quellcode:
program Project5;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  Msg: TMsg;
  bRet: Integer;

begin
  repeat
    writeln('Laeuft1');
    bRet := Integer(GetMessage(Msg, 0, 0, 0));

    if bRet = -1 then
    begin
      writeln('Error');
      Break;
    end
    else
    begin
      writeln(IntToStr(Msg.message));
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
    writeln('Laeuft2');
  until bRet = 0;
end.
Es wird mir nur das Laeuft1 ausgegeben.

mjustin 2. Dez 2014 07:48

AW: bind() in console application
 
Zitat:

Zitat von Lyan (Beitrag 1281856)
Hallo,

ich würde gerne einen Client auf 0.0.0.0:9000 lauern lassen.
Nachdem ich das UDP-Socket erstellt habe und via bind auf den Port gebunden habe, stellt sich für mich noch die Frage wie ich das mit den Messages mache.

Das ist ein Umweg, mit den Socket-Komponenten Indy (und Synapse) benötigt man keinen Workaround um in einer Konsole-Anwendung Windows-Nachrichten zu empfangen. Sie gehen direkt auf die Windows Socket API.

himitsu 2. Dez 2014 08:16

AW: bind() in console application
 
Zitat:

Zitat von Luckie (Beitrag 1281910)
Ähm, bekommen Konsolenanwendungen überhaupt Windows Nachrichten?

Sobald man die Message-Queue abfragt (GetMessage) oder ein "Windows" erstellt, wird von Windows für diesen Thread eine MessageQueue angelegt.
Aber Auslesen und vorallem Behandeln muß man Diese selber (außerhalb des VCL-Threads/Hauptthreads), denn sonst funktionieren dort natürlich keine Messages.

Der schöne Günther 2. Dez 2014 08:36

AW: bind() in console application
 
Sind die uralten Win3.1 Socket-Komponenten nicht auch Message-basiert? Ich kenne mich da nicht aus, meine aber gehört zu haben dass sich der Ansatz als sehr ungünstig herausgestellt hatte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 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