2011-01-25 17:53 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* contrib/hbnetio/utils/netiosrv/netiosrv.prg
  * contrib/hbnetio/utils/netiosrv/netiocmd.prg
    + Added command to stop specific or every connection.
      Using 'stop <ip:port>' or 'stop all'.
This commit is contained in:
Viktor Szakats
2011-01-25 16:54:18 +00:00
parent a05a2ec496
commit ad8e69dbee
3 changed files with 54 additions and 15 deletions

View File

@@ -16,6 +16,12 @@
The license applies to all entries newer than 2009-04-28.
*/
2011-01-25 17:53 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbnetio/utils/netiosrv/netiosrv.prg
* contrib/hbnetio/utils/netiosrv/netiocmd.prg
+ Added command to stop specific or every connection.
Using 'stop <ip:port>' or 'stop all'.
2011-01-25 16:54 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/src/vm/itemapi.c
* do not clear parameter when NULL item is passed to

View File

@@ -15,13 +15,14 @@
FUNCTION hbnetiosrv_LoadCmds( bQuit, bShowInfo )
LOCAL hCmds := { ;
"?" => { "Synonym for 'help'." , {|| cmdHelp( hCmds ) } },;
"clear" => { "Clear screen." , {|| Scroll(), SetPos( 0, 0 ) } },;
"config" => { "Show server configuration." , bShowInfo },;
"sysinfo" => { "Show system/build information.", {|| cmdSysInfo() } },;
"conn" => { "Show connection information." , {| cCommand, netiosrv | HB_SYMBOL_UNUSED( cCommand ), cmdConnInfo( netiosrv ) } },;
"quit" => { "Stop server and exit." , bQuit },;
"help" => { "Display this help." , {|| cmdHelp( hCmds ) } };
"?" => { "" , "Synonym for 'help'." , {|| cmdHelp( hCmds ) } },;
"clear" => { "" , "Clear screen." , {|| Scroll(), SetPos( 0, 0 ) } },;
"config" => { "" , "Show server configuration." , bShowInfo },;
"sysinfo" => { "" , "Show system/build information.", {|| cmdSysInfo() } },;
"conn" => { "" , "Show connection information." , {| cCommand, netiosrv | HB_SYMBOL_UNUSED( cCommand ), cmdConnInfo( netiosrv ) } },;
"stop" => { "[<ip:port>|all]", "Stop specified connection(s)." , {| cCommand, netiosrv | cmdConnStop( cCommand, netiosrv ) } },;
"quit" => { "" , "Stop server and exit." , bQuit },;
"help" => { "" , "Display this help." , {|| cmdHelp( hCmds ) } };
}
RETURN hCmds
@@ -44,13 +45,13 @@ STATIC PROCEDURE cmdHelp( hCommands )
LOCAL n, c, m
m := 0
hb_HEval( hCommands, {| k | m := Max( m, Len( k ) ) } )
hb_HEval( hCommands, {| k, l | m := Max( m, Len( k + iif( Empty( l[ 1 ] ), "", " " + l[ 1 ] ) ) ) } )
AAdd( aTexts, "Commands:" )
/* Processing commands */
FOR EACH n IN hCommands
AAdd( aTexts, " " + PadR( n:__enumKey(), m ) + " - " + n[ 1 ] )
AAdd( aTexts, " " + PadR( n:__enumKey() + iif( Empty( n[ 1 ] ), "", " " + n[ 1 ] ), m ) + " - " + n[ 2 ] )
NEXT
ASort( aTexts, 2 )

View File

@@ -64,6 +64,7 @@ PROCEDURE Main( ... )
LOCAL netiosrv[ _NETIOSRV_MAX_ ]
LOCAL cParam
LOCAL aCommand
LOCAL cCommand
LOCAL cPassword
@@ -78,7 +79,6 @@ PROCEDURE Main( ... )
LOCAL hCommands
LOCAL nSavedRow
LOCAL nPos
LOCAL aCmd
LOCAL cExt
LOCAL cFile
@@ -98,6 +98,8 @@ PROCEDURE Main( ... )
netiosrv[ _NETIOSRV_hConnection ] := { => }
netiosrv[ _NETIOSRV_mtxConnection ] := hb_mutexCreate()
hb_HKeepOrder( netiosrv[ _NETIOSRV_hConnection ], .T. )
FOR EACH cParam IN { ... }
DO CASE
CASE Lower( Left( cParam, 6 ) ) == "-port="
@@ -238,10 +240,9 @@ PROCEDURE Main( ... )
ENDIF
nHistIndex := Len( aHistory ) + 1
nPos := iif( Empty( cCommand ), 0, hb_HPos( hCommands, Lower( cCommand ) ) )
IF nPos > 0
aCmd := hb_HValueAt( hCommands, nPos )
Eval( aCmd[ 2 ], cCommand, netiosrv )
aCommand := hb_ATokens( cCommand, " " )
IF ! Empty( aCommand ) .AND. ( nPos := hb_HPos( hCommands, Lower( aCommand[ 1 ] ) ) ) > 0
Eval( hb_HValueAt( hCommands, nPos )[ 3 ], cCommand, netiosrv )
ELSE
QQOut( "Error: Unknown command '" + cCommand + "'.", hb_eol() )
ENDIF
@@ -296,6 +297,37 @@ STATIC PROCEDURE netiosrv_conn_unregister( netiosrv, pConnectionSocket )
RETURN
PROCEDURE cmdConnStop( cCommand, netiosrv )
LOCAL aToken := hb_ATokens( cCommand, " " )
LOCAL aAddressPeer
LOCAL cIPPort
LOCAL nconn
IF Len( aToken ) > 1
cIPPort := Lower( aToken[ 2 ] )
hb_mutexLock( netiosrv[ _NETIOSRV_mtxConnection ] )
FOR EACH nconn IN netiosrv[ _NETIOSRV_hConnection ]
aAddressPeer := NIL
netio_srvStatus( nconn[ _NETIOSRV_CONN_pConnection ], NETIO_SRVINFO_PEERADDRESS, @aAddressPeer )
IF cIPPort == "all" .OR. cIPPort == AddrToIPPort( aAddressPeer )
QQOut( "Stopping connection on " + AddrToIPPort( aAddressPeer ), hb_eol() )
netio_serverStop( nconn[ _NETIOSRV_CONN_pConnection ], .T. )
ENDIF
NEXT
hb_mutexUnlock( netiosrv[ _NETIOSRV_mtxConnection ] )
ELSE
QQOut( "Error: Invalid syntax.", hb_eol() )
ENDIF
RETURN
PROCEDURE cmdConnInfo( netiosrv )
LOCAL nconn
@@ -323,7 +355,7 @@ PROCEDURE cmdConnInfo( netiosrv )
netio_srvStatus( nconn[ _NETIOSRV_CONN_pConnection ], NETIO_SRVINFO_PEERADDRESS , @aAddressPeer )
QQOut( "#" + hb_ntos( nconn:__enumIndex() ) + " " +;
hb_TToC( nconn[ _NETIOSRV_CONN_tStart ] ) + " " +;
hb_TToC( nconn[ _NETIOSRV_CONN_tStart ], "YYYY.MM.DD", "HH:MM:SS" ) + " " +;
PadR( ConnStatusStr( nStatus ), 12 ) + " " +;
"fcnt: " + Str( nFilesCount ) + " " +;
"send: " + Str( nBytesSent ) + " " +;