Consultor Eletrônico



Kbase P15100: How to quickly avoid 4GL socket connection failures due to unknown socket host?
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   13/08/2009
Status: Unverified

GOAL:

How to quickly avoid 4GL socket connection failures due to unknown socket host?

GOAL:

How to programmatically ping a socket server before establishing a 4GL socket connection to it?

FACT(s) (Environment):

All Supported Operating Systems
OpenEdge 10.x
Progress 9.1x

FIX:

It might take some time for a socket connect to time out when attempting to use an unknown socket server. So, it is faster to ping the device first before connecting to it. e.g.:

DEFINE VARIABLE viConnectCtr AS INTEGER NO-UNDO.
DEFINE VARIABLE viTCPTimeout AS INTEGER NO-UNDO.
DEFINE VARIABLE vlSocketError AS LOGICAL NO-UNDO.
DEFINE VARIABLE vhSocket AS HANDLE NO-UNDO.
DEFINE VARIABLE vcIPAddress AS CHARACTER NO-UNDO.
DEFINE VARIABLE vcReply AS CHARACTER NO-UNDO.
DEFINE VARIABLE vcNumPort AS CHARACTER NO-UNDO.
DEFINE VARIABLE vcSocketErrorInfo AS CHARACTER NO-UNDO.

UPDATE vcIPAddress FORMAT "X(20)":U LABEL "IP Address"
AT ROW 1 COLUMN 20 SKIP
vcNumPort FORMAT "X(20)":U LABEL "Service Name or Port Number"
AT ROW 2 COLUMN 2
WITH FRAME fUpdate SIDE-LABELS TITLE "Server Socket Info" VIEW-AS DIALOG-BOX.

connect-loop:
DO viConnectCtr = 1 TO 2:
vcReply = "".
INPUT-OUTPUT THROUGH VALUE("PING ":U + vcIPAddress + " -n 1":U) NO-ECHO.
REPEAT:
IMPORT UNFORMATTED vcReply.
IF vcReply BEGINS "Reply from" THEN
LEAVE.
END.
IF vcReply BEGINS "Reply from" THEN /* We were able to ping it */
LEAVE connect-loop.
ELSE
IF viConnectCtr = 1 THEN
PAUSE viTCPTimeout NO-MESSAGE.
ELSE
DO:
RUN displayLog("Unable to Ping " + vcIPAddress).
ASSIGN vlSocketError = YES
vcSocketErrorInfo = "Unable to Ping " + vcIPAddress.
RETURN ERROR.
END.
END. /* viConnectCtr = 1 to 2 */

CREATE SOCKET vhSocket.
/* Now try Connecting */
vhSocket:CONNECT("-H " + vcIPAddress + " -S " + vcNumPort) NO-ERROR.

IF vhSocket:CONNECTED() THEN
MESSAGE "Socket connection was established successfully!"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
ELSE
DO:
RUN displayLog("Unable to Establish Connection to Host " + vcIPAddress +
" Port " + vcNumPort).
ASSIGN vlSocketError = YES
vcSocketErrorInfo = "Unable to Establish Connection to Host".
RETURN ERROR.
END. /* Not Connected */

RUN displayLog("Connected to Host " + vcIPAddress + " Port " + vcNumPort).

PROCEDURE displayLog:
DEFINE INPUT PARAMETER pcMsgs AS CHARACTER NO-UNDO.
MESSAGE pcMsgs
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
END PROCEDURE.