Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1600
  • Last Modified:

Freepascal Lnet open multiple sockets

I need a bit of help with app. I am using lnet and synaser and trying to open multiple sockets. While I can create the sockets, I can only open the first one called. Any Ideas?
//UNIT1
      begin
           server1 := TTCPEchoDaemon1.Create;
           ServerSer := TServerSerial.Create;
           ServerSer.Execute;
           server1.Run;
      end; 
//EO UNIT1
 
 
//UNIT2
constructor TTCPEchoDaemon2.Create;
begin 
  FCon := TLTCP.Create(nil);
  FCon.OnReceive := @OnRe;
  FCon.Timeout := 100; // responsive enough, but won't hog cpu
  FCon.ReuseAddress := True;
end;
 
Constructor TServerSerial.Create;
begin
  Fser:=TBlockserial.create;
//  FreeOnTerminate:=true;
//  inherited create(false);
end; 
 
procedure TTCPEchoDaemon1.OnRe(aSocket: TLSocket);
var
  s: string;
  n: Integer;
begin
  if aSocket.GetMessage(s) > 0 then begin // if we received anything (result is in s)
//   Writeln('Got: "', s, '" with length: ', Length(s)); // write message and it's length
    RecvString(s); //catch full string
    FCon.IterReset; // now it points to server socket
  end;
end;
 
procedure TTCPEchoDaemon1.Run;
var
  Quit: Boolean; // main loop control
  Port: Word;    // the port to connect to
begin
 
    try
      Port := Word(StrToInt(SysPort1)); // try to parse port from argument
    except
      on e: Exception do begin
        Writeln(e.message);
        Halt;
      end;
    end;
    Quit := false;
 
    if FCon.Listen(Port) then begin // if listen went ok
    Writeln('Server running! on '+SysPort1);
       repeat
        FCon.Callaction; // eventize the lNet
      until Quit; // until user quit
    end; // listen
end; 
 
procedure TServerSerial.Execute;
begin
   with Fser do
    begin
    RaiseExcept:=false;
    Connect(PortNo);
     WriteLn('Serial Port Connected');
     Config(Baud,databits,parity,stopbits ,softwarefl,hardwarefl);
      if active = true then begin
         while not (LastError <> 0) do begin
            if lastError<>0 then break;
              if canread(1000) then  begin
              LCMD := Recvstring(1000);
              WriteLn(LCMD);
              myconverterfunc1:=@CallConv1;
              myconverterfunc1(LCMD);
              end;
         end;
      end;
    end;
end; 
 
function TTCPEchoDaemon1.RecvString(S2: String): AnsiString;
var
  n : integer;
  Stringtest : String;
begin
    n := 1;
    while n <= Length(S2) do begin
          if S2[n] = LF then begin
          myconverterfunc1:=@CallConv1;
          myconverterfunc1(Stringtest);
          stringtest := '';
          Delete(S2, n, 1);
          Continue;
          end;
    Stringtest := Stringtest+Copy(S2, n, 1);
    inc(n);
    end;
 
end;          
 
//EO UNIT2

Open in new window

0
lloydie-t
Asked:
lloydie-t
1 Solution
 
lloydie-tAuthor Commented:
Seems  what I need is Threads.
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now