PDA

Ver la Versión Completa : Servidor DataSnap


cmfab
19-10-2014, 14:58:23
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:

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.

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 (http://theroadtodelphi.wordpress.com/2010/02/21/checking-if-a-tcp-port-is-open-using-delphi-and-winsocks/).
Por un lado dicen que WSACleanup cierra todos las conexiónes, pero que también puedes hacer

CloseSocket(sock);

Allí proponen también otra solución para comprobar si un puerto está abierto.

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