Jump to content

ChrisChuah

Members
  • Content Count

    108
  • Joined

  • Last visited

Posts posted by ChrisChuah


  1. Hi

    When i use the IdUDPClient inside the thread object, the idUDPClient does not get any messages back even though it can be seen from the Wireshark that the message was sent back.

    However, if i place the IdUDPClient on a Form, i am able to get the message.

     

    Something funny is that when i use the IdUDPClient on the Form to send out the message, 

    the first response message header is SOREQ <== this header is request header

    Checking on the Wireshark, the server returned SORE

    I tried to initialise the l_buf to $0 before retrieving from idUDPClient.

    However, its only the first message sent that will be always SOREQ and the rest will be SORE

    And the IP address returned in the message should be 192.168.84.128 which indicate the server address itself.

    seems like the first message is the same message that i sent out.

     

     

    please advise

     

    regards

    chris

     

    ===== Code for IdUDPClient on Form =====

    procedure TForm1.Button2Click(Sender: TObject);
    var
      l_port : UInt32;
      l_memStream : TMemoryStream;
      l_len : integer;
      l_buf, l_buf1 : TIdBytes;
      l_ilUDPData : Tt_BootReqMsg;
      l_ip : string;
      l_ipBytes : array[0..15] of byte;
      FMsg : string;
      FRepliedClientIP : string;
      FRepliedClientPort : Uint32;
      l_index : integer;
    begin
      l_ip := getOwnIP;
      if l_ip = '' then begin
        writeLog('Cannot find own IP address');
        exit;
      end;
      IdUDPClient1.Host := '192.168.84.255';
      IdUDPClient1.Port := 55510;
      IdUDPClient1.BoundPort  := 55510;
      try
    //    FUDP.Active := true;
        l_memStream := TMemoryStream.create;

        l_buf := ToBytes('SOREQ'#0, IndyTextEncoding_ASCII);
        l_memStream.Write(l_buf[0], 6);

        l_port := 55510;
        l_port := GStack.HostToNetwork(l_port);
        l_memStream.write(l_port, 4);

        getArrayBytes(l_ip, l_ipBytes);
        l_memStream.Write(l_ipBytes, SizeOf(l_ipBytes));

        l_len := l_memStream.size;
        setLength(l_buf, l_len);
        l_memStream.position := 0;
        l_memStream.Read(l_buf[0], l_len );
        l_memStream.Clear;
        try
          IdUDPClient1.ReceiveTimeout := 3000;
          IdUDPClient1.BroadcastEnabled := true;
          IdUDPClient1.SendBuffer(l_buf);
          FMsg := 'Send To Address: ' + IdUDPClient1.Host + ' Port: ' + Inttostr(IdUDPClient1.Port) + ' using IP: ' + l_ip;
          WriteLog(FMsg);
          setLength(l_buf, sizeOf(l_ilUDPData));
          for l_index := 0 to length(l_buf) - 1 do. <== initialise the buffer but i still receive SOREQ only on 1st time.
            l_buf[l_index] := byte($0);

          l_len := IdUDPClient1.ReceiveBuffer(l_buf, 2000);
          if l_len <= 0 then begin
            FMsg:='No Data received in UDP';
            FRepliedClientIP := '';
            FRepliedClientPort := 0;
            WriteLog(FMsg);
          end
          else begin
            l_memStream.Clear;
            l_memStream.Position := 0;
            l_memStream.Write(l_buf[0], l_len);
            l_memStream.Position := 0;
            setlength(l_buf1, 6);
            l_memStream.Read(l_buf1[0], length(l_buf1));
            WriteLog('Op Code: ' + getStringFromBytes(l_buf1));
            l_memStream.Read(FRepliedClientPort, sizeof(FRepliedClientPort));
            WriteLog('Port value: ' + Inttostr(FRepliedClientPort));
            l_memStream.Read(l_ilUDPData.hid, sizeof(l_ilUDPData.hid));
            FRepliedClientIP := getStringFromBytes(l_ilUDPData.hid);
            FRepliedClientPort := GStack.NetworkToHost(FRepliedClientPort);
            WriteLog('Replied. IP: ' + FRepliedClientIP + ' Port: ' + Inttostr(FRepliedClientPort));
          end;
        except
          on E:Exception do begin
            FMsg := 'Error in Recv Data in UDP: ' + e.message;
            FRepliedClientIP := '';
            FRepliedClientPort := 0;
            WriteLog(FMsg);
          end;
        end;
        l_memStream.Free;
      except
        on E:exception do begin
          FMsg := 'Exception in SoFind: ' + e.Message;
          FRepliedClientIP := '';
          FRepliedClientPort := 0;
          WriteLog(FMsg);
        end;
      end;

    end;
     

    ==== End =====

     

    380883448_ScreenShot2022-05-27at2_10_12PM.png.dc0c76981140d9c153e1f801f4d6a775.png1796901076_ScreenShot2022-05-27at2_10_23PM.thumb.png.b1f074d6598bfb7c485260a2c9e6190b.png1689686418_ScreenShot2022-05-27at2_10_39PM.thumb.png.f912e46f3fbc1778b6e59875d53f76b9.png


  2. Hi Remy

    Would like to ask why the UDPClient did not receive any data.

    Attached is the screen capture of the Wireshark.

    The first pic shows the server received the message sent from the delphi client

    The second pic shows the server sends out the SORE (response) message to the delphi client IP address.

    However, the client reported that there is no data received

     

    <27/5/2022 11:14:02 am> Send To Address: 192.168.84.255 Port: 55510 using IP: 192.168.84.129
    <27/5/2022 11:14:05 am> IP:  Port: 0 replied
    <27/5/2022 11:14:05 am> No Data received in UDP

     

    Did i do something not right?

    please advise

     

    regards

    chris

     

     183309202_ScreenShot2022-05-27at11_16_32AM.thumb.png.9233321f3c92cc86f555d794e4c622e5.png21642686_ScreenShot2022-05-27at11_16_55AM.thumb.png.8de6716efc5ad415666e4a9a05e97504.png1504326953_ScreenShot2022-05-27at11_18_33AM.png.f6734a8a20bfedfff7b1312bf86acc90.png


  3. Thanks Remy

    The only problem that i have with strings in delphi is that I dont know if they are Windows widechar or UTF8 char or ansi value

     

    Edit1.text := 'MET';

     

    ShowMe(Edit1.text);

     

    Function showMe(aValue : string);

    var

      l_value : string;

    begin

      l_value := aValue + 'A';

      UDPClient.Write(l_value);

    end;

     

    So when the edit1 value is pass into ShowMe function, what is the length of l_value? 

    As my server only accepts ANSI type of characters, the data sent may be Windows WideChar.

    Hence to be on the safe side, i would have to translate it to idBytes.

     

    What is the general rule on how you would send data when the server only accepts ANSI characters.

     

    Please advise

    regards

    chris

     

    BTW, After 20 years of using Delphi, i still remembered you were helping me last time when i was using Delphi 5, 6 in one of the forum.

    Now, its hard to find help for delphi.


     

     


  4. Hi

    I am trying to create a thread that will send out UDP message and when it receive the UDP message from the server, it will send a Reply as event back to the caller.

    I create the UDPClient in the Execute function and of course i would need to free it when the thread ends.

    But why do i get access violation when i free it?

    The call stack is

    --IdSocketHandle.CloseSocket.

    --IdSocketHandle.Destroy

    -- System.TObject.free;

    --IdUDPBase.CloseBinding

    --IdUDPBase.Destroy

    --IdUDPClient.Destroy

     -- System.TObject.Free

    --FUDP.Free;

     

    please help to guide me what is the best way to send out UDP message and wait for reply?

    Should i use UDPServer rather than UDPClient?

     

    === Code ===

    procedure ilUDPClientThd.Execute;
    var
      l_port : UInt32;
      l_memStream : TMemoryStream;
      l_len : integer;
      l_buf : TIdBytes;
      l_ilUDPData : Tt_BootReqMsg;
      l_ip : string;
      l_ipBytes : array[0..15] of byte;
      FUDP: TIdUDPClient;
    begin
      { Place thread code here }
      l_ip := getOwnIP;
      if l_ip = '' then begin
        DoOnLog('Cannot find own IP address');
        exit;
      end;
      FUDP := TIdUDPClient.Create(nil);
      FUDP.Host := FBroadcastIP;
      FUDP.Port := FBroadcastPort;
    //  FUDP.Binding.Port := FBroadcastPort;
      try
        l_port := FBroadcastPort;
        l_memStream := TMemoryStream.create;

        l_buf := ToBytes('SOREQ', IndyTextEncoding_ASCII);
        l_memStream.Write(l_buf[0], 6);

        l_port := GStack.HostToNetwork(l_port);
        l_memStream.write(l_port, 4);

        getArrayBytes(l_ip, l_ipBytes);
        l_memStream.Write(l_ipBytes, SizeOf(l_ipBytes));

        l_len := l_memStream.size;
        setLength(l_buf, l_len);
        l_memStream.position := 0;
        l_memStream.Read(l_buf[0], l_len );
        l_memStream.Clear;
        try
          FUDP.ReceiveTimeout := 3000;
          FUDP.BroadcastEnabled := true;
    //      FUDP.Active := true;
          FUDP.SendBuffer(l_buf);
    //      FUDP.SendBuffer(l_buf[0], l_len);
          FMsg := 'Send To Address: ' + FUDP.Host + ' Port: ' + Inttostr(FUDP.Port) + ' using IP: ' + l_ip;
          Synchronize(WriteToLog);
    //      l_len := FUDP.ReceiveBuffer(l_ilUDPData, sizeof(l_ilUDPData), FUDP.ReceiveTimeout);
          setLength(l_buf, sizeof(l_ilUDPData));
          l_len := FUDP.ReceiveBuffer(l_buf);
          if l_len <= 0 then begin
            FMsg:='No Data received in UDP';
            FRepliedClientIP := '';
            FRepliedClientPort := 0;
            Synchronize(ReplyToClient);
            Synchronize(WriteToLog);
          end
          else begin
            l_ilUDPData.Port := GStack.NetworkToHost(l_ilUDPData.Port);
            FRepliedClientIP := getStringFromBytes(l_ilUDPData.hid);
            FRepliedClientPort := l_ilUDPData.port;
            Synchronize(ReplyToClient);
          end;
        except
          on E:Exception do begin
            FMsg := 'Error in Recv Data in UDP: ' + e.message;
            FRepliedClientIP := '';
            FRepliedClientPort := 0;
            Synchronize(ReplyToClient);
            Synchronize(WriteToLog);
          end;
        end;
        l_memStream.Free;
        FUDP.Binding.Destroy;
      except
        on E:exception do begin
          FMsg := 'Exception in SoFind: ' + e.Message;
          FRepliedClientIP := '';
          FRepliedClientPort := 0;
          Synchronize(ReplyToClient);
          Synchronize(WriteToLog);
        end;
      end;
      FUDP.Disconnect;
      FUDP.Free; <<==== Access violation when i tried to free UDP Client 
    end;


  5. 20 hours ago, PeterBelow said:

    Create a COM dll, Delphi has a wizard for that. Google for "C# com interop" to find examples for how to use such a thing from the .NET side.

    Hi

    Actually I want to use delphi to create a DLL with functions or procedures containing a callback.

    How can i create such functions in delphi so that the project can be compiled to a dll for C Sharp programmer to use

    Previously all DLL functions does not have function pointer or callback functions when i was using Delphi 6 era.

    Also my C sharp programmers said they cannot use COM because their program will be running in Docker for linux

     

     

    please advise

     

    regards

    chris

     


  6. Hi

    I have an existing component that communicates with a server via TCP.

    However, this component can only be used in delphi.

    When i call a function in this component, it will send out a TCP message.

    After some time, it will return back data and it will trigger an event back in the component.

    So, anytime i want to use this component, i can drop the component into the form.

    I can double click on the event and write codes to handle the result from the event.

     

    Now, if i want to make this component into a DLL for C sharp programmer to use

    How can i create events into the dll for C Sharp programmer to use?

     

    Is there any example that i can use or follow

     

    please help

     

    regards

    chris

     


  7. Actually, its not easy to find components written for Delphi

    For example, component to read ePassport whereby it need to capture the image of the MRZ portion of the passport and then read the NFC chip from the passport.

    These are quite specialised components which you can find libraries for swift, java, c sharp etc. 

    However, cant find for delphi.

     


  8. Hi

    Currently i need to go back to maintain my source code written 10 years ago.

    when i tried to run IdHTTP.Head function, sometimes it would hang there and this caused my thread to hang there.

    What can i solve this "hanging" problem?

    Where can i download the latest Indy 9 (9.0.50) or Can i download Indy 10 to work with Delphi 6?

    please help

     

    regards

    chris


  9. Hi

    In Delphi 10.4.1, when the Win64 program called WebBrowser1.Navigate("file://z:\filename.pdf") where z drive is a shared drive, it will display the pdf in the Browser.

    However, when i upgraded to 10.4.2, the same function will prompt for File Download.

    I also tested to navigate a C drive pdf document and it will also prompt the file download

    Please help

     

    ====== source =========

    procedure TForm1.Button1Click(Sender: TObject);
    var
     l_filename : string;
    begin
      if OpenDialog1.Execute then begin
        l_filename := OpenDialog1.FileName;
    //    l_filename := 'file://' + l_filename;
        WebBrowser1.Navigate(l_filename);
      end;
    end;

    ======= End ================

     

    regards

    chris

    Screenshot 2021-03-06 at 17.26.04.png

    Screenshot 2021-03-06 at 17.25.47.png


  10. Hi

    Has anyone done this soap interface before?

    I am able to get the SOAP interface using this

    https://ove-osb.microsdc.us:9015/OPERA9OSB/opera/OWS_WS_51/Information?WSDL

    The WSDL Import will generate a Information.pas file.

    I tried to call the LovQueryRequest but it only contains the basic XML without the headers.

    Anyone knows what i should do in order to add the OGHeaders and SecurityHeaders to it?

     

    regards

    chris


  11. hi

    when the new patch is released, the PAServer pkg is also shown on my Windows VM. So i dragged the PAServer pkg into my Mac OS to install it.

    After installation, i ran my app but it showed disconnected session. On the PAServer in my MacOS, it showed 

    >list

    Process Control Server started pid 1647 exe built Feb 27 2020

    Error: file permissions do not allow debugging.

     

    Just today, i saw another patch is released but my PA Server still does not allow iOS debugging.

    I am running Mojave instead of Catalina because Catalina does not allow the PAServer to run because it is in 32 bit.

     

    anyone can advise?

    regards

    chris


  12. Hi

    Is there a function when there is switch event, to disallow the component from switching from off to on?

    In my function, when the user activate the OnSwitch event, i will prompt the user to turn off?

    if the user said no, then the switch should remain at On. However, now the switch will auto turn off even though i set the IsCheck to true

     

    any ideas?

     

    regards

    chris

×