• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1606
  • 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

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

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