有个问题想问一下,我看到有一些开发大型数据库有这样一个功能。就是
能看到有哪些客户端连到服务器了。如果不想让他连接还可也把它踢下去这什用什么原理实现的

解决方案 »

  1.   

    这个是我在看QAD公司的ERP有这样的功能.
      

  2.   


        您想知道有誰正在使用您的 Access 資料庫嗎? 
     
     
     如果您使用 Access 建立了一個多人使用的資料庫環境,有時候您必須要知道有誰正在使用程式連進這個共享的資料庫,但是您又不想因為如此而要建立一套完整的 Access 安全系統,您有二個選擇:第一個: 您可以在資料庫中建立一個 "Login Table",每次使用者進入或離開系統時就 Update 這個 Table. 
    第二個: 較好一點,您可以使用 msldbusr.dll,它可以告訴您目前正連進資料庫的電腦名稱 (Computer Name),這些資料其實是存放在副檔名為 LDB 的檔案中。一旦您從 DLL 中抓到這些資料,您便可以送出訊息,通知 Client 端的使用者 (Remote User) 結束應用程式,以中斷和資料庫的連結,然後您便可以使用 Exclusive Mode 來維護資料庫了。 在這裡,我們要說明的是第二種方法,也就是使用 msldbusr.dll。它提供了二個 Function,說明如下:1、LDBUser_GetUsers:呼叫後會傳回二部份,一個是使用者陣列,一個是連結到資料庫的使用者數。Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _
    As String, ByVal lpszFilename As String, ByVal nOptions As Long) As IntegerlpszUserBuffer():傳回使用者陣列,注意!必須使用 ReDim 宣告成變動陣列!
    lpszFilename:資料庫名稱 ( .mdb 完整路徑 ),若 .ldb 檔不存在,會傳回錯誤代碼。
    nOptions:下參數宣告資料回傳的型態。可以使用的參數有四個,如下:1=傳回自從 .ldb 產生後,所有曾經使用資料庫的使用者機器名稱 (Computer Name) 及數目。
    2=只傳回目前正在使用資料庫的使用者機器名稱 (Computer Name) 及數目。
    4=只傳回導致目前資料庫損毀的使用者機器名稱 (Computer Name)。
    8=只傳回使用者的總數,但是並不傳回使用者陣列。2、LDBUser_GetError:呼叫 LDBUser_GetUsers 若有錯誤產生,可根據傳回的錯誤代碼找到說明。Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As StringnErrorNo:呼叫 LDBUser_GetUsers 產生錯誤所傳回的代碼,介於 -1 至 -14 之間。說明如下:-1 = Can't open the LDB file. ( 無法開啟 LDB 檔案 )
    -2 = No user connected. ( 沒有使用者在使用資料庫 )
    -3 = Can't create an array. ( 無法建立陣列 )
    -4 = Can't redimension array. ( 無法重新建立陣列 )
    -5 = Invalid argument passed. ( 傳入無效的參數 )
    -6 = Memory allocation error. ( 記憶体配置錯誤 )
    -7 = Bad index. ( 無效的索引 )
    -8 = Out of memory. ( 記憶体不足 )
    -9 = Invalid argument. ( 無效的參數 )
    -10= LDB is suspected as corrupted. ( LDB 檔案可能損毀 )
    -11= Invalid argument. ( 無效的參數 )
    -12= Unable to read MDB file. ( 無法讀取 MDB 檔案 )
    -13= Can't open the MDB file. ( 無法開啟 MDB 檔案 )
    -14= Can't find the LDB file. ( 找不到 LDB 檔案 )'範例程式:( 移除所有的 Form,請將以下程式複製到 .bas 檔案中即可執行 )Option ExplicitDeclare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _
    As String, ByVal lpszFilename As String, ByVal nOptions As Long) As IntegerDeclare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As StringSub MAIN()
    Dim psMDBFilename As String
    psMDBFilename = InputBox("請輸入資料庫名稱:")
    If Len(psMDBFilename) Then
    ShowUsers psMDBFilename
    End If
    End Sub
    Sub ShowUsers(psFilename As String)
    ReDim lpszUserBuffer(1) As String
    Dim psError As String
    Dim cUsers As Long
    Dim iLoop As Long'呼叫 LDBUser_GetUsers 傳回使用者陣列
    cUsers = LDBUser_GetUsers(lpszUserBuffer(), psFilename, 1)'確認是否傳回使用者陣列
    If (cUsers = 0) Then
    Debug.Print "No Users."
    GoTo Exit_ShowUsers
    End If'若有錯誤則顯示錯誤訊息
    If (cUsers < 0) Then
    psError = LDBUser_GetError(cUsers)
    Debug.Print "Error #:"; cUsers; "--"; psError
    GoTo Exit_ShowUsers
    End If'顯示使用者陣列
    For iLoop = 1 To cUsers
    Debug.Print "User "; iLoop; ":"; lpszUserBuffer(iLoop)
    Next iLoopExit_ShowUsers:
    End Sub 
    上边的资料也许对你有用,你也可以查找下边的网址
    http://www.cndevx.com/tips/default.asp?page=2&sub_kind=&title=
      

  3.   

    和你做通讯软件的原理一样,client连接数据库总要通过一个活动的连结,server端只不是显示这个连结的信息而已。
      

  4.   

    怎样处理客户再现的判断?GZing.
    轮询的方法在小范围还可以,可是,众多客户的情况又怎么样呢?
    由客户端发送信息,超时的删掉,怎样?
      

  5.   

    用winsock是不是可以实现呢?发送消息来进行判断!
      

  6.   

    不知道你到底想开发什么样的软件。如果客户端和服务器端都是自己编的,应该不难的,我没有在VB中用过Winsock,不清楚是如何封装的,如果不能从连接套接字取得客户端的信息,如果不能,可以在服务器端建一个数组之类的,保存每个客户端的信息。当Winsock连接成功时,客户端向服务器发送自己的信息,服务器端保留它,不就可以了吗。