Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Servidor DataSnap (https://www.clubdelphi.com/foros/showthread.php?t=86894)

cmfab 19-10-2014 14:58:23

Servidor DataSnap
 
Hola a todos, tengo un servidor DataSnap, sucede que la aplicación cliente cada cierto intervalo debe conprobar si existe este servidor en la IP y puerto determinados, para concocer esto uso la función siguiente:

Código Delphi [-]
function PortTCP_IsOpen(dwPort : Word; ipAddressStr:AnsiString) : boolean;
var
  client : sockaddr_in;
  sock : Integer;
  ret : Integer;
  wsdata : WSAData;
begin
  Result:=False;
  ret := WSAStartup($0002, wsdata); //Inicializa Winsock
  if ret<>0 then exit;

  try
   client.sin_family := AF_INET; //Establece el protocolo a usar en este caso (IPv4)
   client.sin_port := htons(dwPort);
   client.sin_addr.s_addr := inet_addr(PAnsiChar(ipAddressStr));
   sock :=socket(AF_INET, SOCK_STREAM, 0); //crea un socket
   Result:=connect(sock,client,SizeOf(client))=0; //Estable conexión con un socket
   finally
     WSACleanup;
   end;
end;

lo que me sucede es que cuando mido el consumo de memoria del servidor este aumenta considerablemente cuando el cliente usa esta función, no se si está quedando algún objeto por liberar en el algoritmo, pero no encuentro como bajar el consumo de memoria, o si existe otra manera de saber si está activo el servidor, na posibilidad sería hacer la conexión mediante el bloque try ... except, pero me gustaría poder depurar esta función que la uso en otras tareas y hacer que baje el consumo al comprobar la ip y puerto

Gracias e antemano a todos por las atenciones

Casimiro Notevi 19-10-2014 15:35:43

Por favor, no olvides poner títulos descriptivos de lo que preguntas, gracias :)

cmfab 19-10-2014 16:21:27

Si tienes razón, gracias por el señalamiento, lo tendré mejor en consideración a futuro

Casimiro Notevi 19-10-2014 16:49:06

Gracias por tu comprensión :)

En relación a tu pregunta, ¿has hecho una búsqueda en los foros por "datasnap"?

cmfab 19-10-2014 17:39:49

En realidad la hice, pero no encontré nada similar, y como esta función la necesito usar en otras tareas, decidí exponerla a ver si es que hay algo en ella que satura el servidor. Gracias

duilioisola 20-10-2014 11:18:39

Yo no se mucho de Sockets, pero quizás debas desconectar el Socket después de comprobar que puedes conectar.
Código Delphi [-]
  try
   client.sin_family := AF_INET; //Establece el protocolo a usar en este caso (IPv4)
   client.sin_port := htons(dwPort);
   client.sin_addr.s_addr := inet_addr(PAnsiChar(ipAddressStr));
   sock :=socket(AF_INET, SOCK_STREAM, 0); //crea un socket
   Result:=connect(sock,client,SizeOf(client))=0; //Estable conexión con un socket

   // Quizás falta algo como esto ????
   Disconnect(sock, ...);
   // ????

   finally
     WSACleanup;
   end;

cmfab 20-10-2014 12:23:22

Gracias podría ser una variante, pero como reviso todos los parámetros de la función Disconect ?

duilioisola 20-10-2014 12:48:20

Puedes ver esta conversación.
Por un lado dicen que WSACleanup cierra todos las conexiónes, pero que también puedes hacer
Código Delphi [-]
CloseSocket(sock);
Allí proponen también otra solución para comprobar si un puerto está abierto.
Código Delphi [-]
function TForm7.PortIsOpen(const APort: Integer; const AAddress: string):
    Boolean;
var
  LTcpClient: TIdTCPClient;
begin
  LTcpClient := TIdTCPClient.Create(nil);
  try
    try
      LTcpClient.Host := AAddress;      //which server to test
      LTcpClient.Port := APort;         //which port to test
      LTcpClient.ConnectTimeout := 200; //assume a port to be closed if it does not respond within 200ms (some ports will immediately reject, others are using a "stealth" mechnism)
      LTcpClient.Connect;               //try to connect
      result := true;                   //port is open
    except
      result := false;
    end;
  finally
    freeAndNil(LTcpClient);
  end;
end;
 
procedure TForm7.Button1Click(Sender: TObject);
begin
  if PortIsOpen(1234, '127.0.0.1') then
    ShowMessage('OPEN')
  else
    ShowMessage('NOT OPEN');
end;

cmfab 20-10-2014 12:54:00

Muchas gracias, espero poder resolver con esos ejemplos


La franja horaria es GMT +2. Ahora son las 04:03:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi