<%#code locality="page-global"%> <% * Page Global #include "socket.ch" *#Define CPATH "C:\FCDB\" #Define cKey 'x@zVwr^vtm&lqkjPn%e8zpe$nd8bnq#tKsIu3Ds(jrut@wb%cluoSVgj*usgQcbv93ndWanrL$mdht^j' FUNCTION InstructServer( cUserID ) *{Service->UserId, Service->LastName, Service->Id} RETURN { ; { .F., {|x| DbUseArea( .T., , x ) }, "Service" },; { .F., {|x| OrdListAdd( x ) }, "ServNuId.ntx" },; { .F., {|x| DbSeek( x ) }, cUserId },; { .T., {|| {Service->UserId, Service->LastName, Service->Id} } },; { .F., {|| DbCloseArea() } } ; } FUNCTION uSocketConnect(cServer,nPortNumber) *LOCAL cServer := "192.168.0.82" *LOCAL nPortNumber := 1042 LOCAL nError := 0 LOCAL nSocket := 0 nSocket := SocketOpen( SOCK_STREAM, cServer, nPortNumber, @nError ) RETURN nSocket FUNCTION uSocketSend(nSocket,xData) * Convert the array of code blocks to binary data and * obtain length of binary string * Transmit binary data to the server process. * The first four bytes tell the length of the binary string. LOCAL lOk *LOCAL cBuffer := CRYPT(Var2Bin( aInstruct ),cKey) LOCAL cBuffer := Var2Bin( xData ) // Var2Bin( aInstruct ) LOCAL cLength := U2Bin( Len( cBuffer ) ) lOk := (SocketSend( nSocket, cLength + cBuffer ) > 0) RETURN lOk FUNCTION uSocketReceive(nSocket,cError) LOCAL nBytes := 0,; cBuffer := "",; cLength := "",; nError := 0 * Read first 4 bytes from socket... * cLength will return legth of actual pending data clength := SPACE(4) nBytes := SocketRecv( nSocket, @cLength, 4, ,@nError ) * Retrieve binary data created in the server process from socket nBytes := Bin2U( cLength ) // Actual length of pending data cBuffer := Space( nBytes ) // cBuffer prepared to receive data nBytes := SocketRecv( nSocket, @cBuffer, nBytes, ,@nError ) *cBuffer := CRYPT(cBuffer,cKey) IF nError <> 0 // Some sort of error cError := "ERROR:" + LTrim(Str(nError)) + " BYTES RECEIVED:" + LTrim(Str(nBytes)) xRetval := {cBuffer} ELSEIF "ERROR" $ cBuffer cError := cBuffer xRetVal := {cBuffer} ELSE xRetVal := Bin2Var( cBuffer ) cError := "" ENDIF *cError := "Some Error: ["+STR(nBytes)+"] cLength is "+clength *xRetVal := {"Item 1","Item 2","Item 3"} RETURN xRetVal %> <%#Page layout="global.layout" trace="yes" %> @SECTION bodyload @SECTION body <% nSocket := 0 cMsg := "" lOk := .F. ::Session:EMP_ID := "" ::Session:nPass := 0 IF VALTYPE(::Login:Data:Counter) == "N" ::Login:Data:Counter++ ELSE ::Login:Data:Counter := 1 ENDIF IF ::Session:login == NIL ::Session:login := .T. ::Session:EMP_ID := "" ELSEIF ::HttpRequest:Form:actmode == "login" *LoadDBE() *DBUSEAREA(.T.,NIL,"SERVICE",,.T.) *ORDLISTADD("ServNuId") // UPPER(UserId) *cServer := "localhost" *nPortNumber := 1042 *nError := 0 *nSocket := SocketOpen( SOCK_STREAM, cServer, nPortNumber, @nError ) nSocket := uSocketConnect(::application:config:socket:server,VAL(::application:config:socket:port)) IF nSocket > 0 SocketSetOption(nSocket,SO_DEBUG,.T.) SocketSetOption(nSocket,SO_KEEPALIVE,.T.) cSocketAddr := SocketGetSockName( nSocket )[3] nHandle := SocketGetHandle( nSocket ) aInstruct := InstructServer(PADR(UPPER(::Params:user),20)) uSocketSend(nSocket,aInstruct) *cError := "nSocket is"+STR(nSocket) cError := "" aService := uSocketReceive(nSocket,@cError) ELSE cError := "Socket Server Is Not Running" ENDIF IF .NOT. EMPTY(cError) cMsg := cError * ELSEIF (.NOT. EMPTY(aService[29])) .AND.; // Service->userId * UPPER(ALLTRIM(aService[3])) == UPPER(ALLTRIM(::Params:pw)) ELSEIF (.NOT. EMPTY(aService[1])) .AND.; // Service->userId UPPER(ALLTRIM(aService[2])) == UPPER(ALLTRIM(::Params:pw)) ::Session:EMP_ID := aService[3] ::Session:nSocket := nSocket ::Session:cAddress:= cSocketAddr lOk := .T. ELSE cMsg := "User or password not valid!" ENDIF ENDIF %> <% if lOk %>
<% else %>
@if ! empty(cMsg) @else @endif
@(cMsg)
User:
Password:
<% endif IF nSocket > 0 uSocketSend(nSocket,"D~O~N~E") SocketShutDown(nSocket,SD_BOTH) SocketClose(nSocket) ENDIF %>