Avatar billede morten_s Nybegynder
10. juni 2002 - 15:12 Der er 5 kommentarer og
1 løsning

Server socket

Hvordan skelner man mellem de forskellige connections på en ServerSocket ?

jeg er selvfølgelig klar over at man kan traversere connection igennem med

for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
begin
  ServerSocket.Socket.Connections[i].SendText('Hesten er grøn');

men er der ikke en måde at skelne dem fra hinanden på ? f.eks. kunne det være at de forskellige connections fik uddelt et unikt nummer ved connection ?
Avatar billede martinlind Nybegynder
10. juni 2002 - 15:23 #1
Jeg mener der er en RemoteAdr property, så du kan se hvilken Client du har fat i, eller skal du lave en nedarvning at ClientThread classen og en OnCreateThread event hvor du giver den din egen classe med så kan du lægge det du har lyst til af ID i den classe du har lavet. ( håber det er til at forstå :-) )

/Martin
Avatar billede martinlind Nybegynder
10. juni 2002 - 15:26 #2
Eks. :

TMyServerThread = class(TServerClientThread)
  private
    FData      : TStringStream;
    FTransDB  : TIBTransaction;
    FTransQ    : TIBTransaction;
    FDatabase  : TIBDatabase;
    FQuery    : TIBQuery;
    FMsgHandle : HWND;
    FResponseType: TSrvCmdsResponseType;

    FDefDBName,
    FDefUser,
    FDefPassW : String;
    procedure DoSQLExecParamCommand(aStrx: String);
   
  protected
    procedure SetResponseType(const Value: TSrvCmdsResponseType);
    function  BuildResponse: String;
    function  DoCSVResponse: String;
    function  DoRawResponse: String;
    function  GetQueryFields: String;
    procedure SendResultToClient(aStrx: String);
    function  GetTokenNo(No: Integer; Strx: String; Ch: Char): String;
    function  GetFirstToken( VAR Strx: String; Ch: Char ): String;
    function  GetFirstCmd(var aStrx: String): Integer;
    procedure SetDatabase(const Value: TIBDatabase);
    procedure SetQuery(const Value: TIBQuery);

    procedure DoCmdError( VAR aStrx : String );
    procedure DoHelpCommand;
    procedure DoSQLExecuteCommand( aStrx : String );
    procedure DoSQLSelectCommand( aStrx : String );
    procedure DoGetHTMLPage(aStrx: String);
    procedure DoDBSetup( aStrx : String );
    procedure InitDBConn( VAR aStrx : String );

    procedure ParseCmds;

    procedure WriteToScreen;
    procedure ClientExecute; override;
  public
    property Terminated;

    procedure PostMsgToLog( aStrx : String );
    procedure InitDB;
    procedure InitThread;

    property MsgHandle : HWND read FMsgHandle write FMsgHandle;

    property Query : TIBQuery read FQuery write FQuery;
    property Database : TIBDatabase read FDatabase write FDatabase;
    property ResponseType : TSrvCmdsResponseType read FResponseType write SetResponseType;
  end;

-----------------------

procedure TMainForm.ServerSocket1GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
  SocketThread := TMyServerThread.Create(TRUE,ClientSocket);
  FClients.Add(SocketThread);
  TMyServerThread(SocketThread).InitThread;
  TMyServerThread(SocketThread).MsgHandle := Self.Handle;
  //TMyServerThread(SocketThread).ParentForm := Self;
  WriteToLog('GetThread - SocketID : '+IntToStr(ClientSocket.SocketHandle)+' ThreadID : '+IntToStr(SocketThread.ThreadID),clBlack);
  SocketThread.Resume;
end;
Avatar billede morten_s Nybegynder
10. juni 2002 - 15:28 #3
Jeg bruger også RemoteAdr propertyen, men problemet er hvis der er startet to instancer clienten på samme PC, så får jeg samme besked tilbage til begge programmer

eks.

Jeg har en PC med navn Morten-XP

når jeg så sender tilbage

for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
begin
  if Socket.RemoteAdr = 'Morten-XP' // "Morten-XP ligger selvfølgelig i en variabel
  ServerSocket.Socket.Connections[i].SendText('Hesten er grøn');
Avatar billede morten_s Nybegynder
10. juni 2002 - 15:31 #4
ligger der et brugbart nr i ClientSocket.SocketHandle ?
Avatar billede martinlind Nybegynder
10. juni 2002 - 15:32 #5
du kan bruge SocketThread.ThreadID eller ClientSocket.SocketHandle

/Martin
Avatar billede morten_s Nybegynder
10. juni 2002 - 15:35 #6
Jeg tror jeg vælger den nemme løsning, programmet kan kun startes en gang per PC ;-))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester