| 
				 客户端侦听服务器连接请求,只要连接上,客户端根据服务器的指令来作出操作,其主要程序代码与步骤如下: 
(1)Private Sub sckserver_ConnectionRequest(ByVal requestID As Long) 
sckserver.Accept requested   '服务器首先接收对应客户端申请连接的请求 
End Sub 
(2)彼此建立TCP/IP连接成功后服务器发送“关机”命令 
Private Sub sckserver_DataArrival(ByVal bytesTotal As Long) 
Dim remotedata As String 
sckserver.GetData remotedata    '接收关机命令 
If Trim(remotedata) = "关机" Then 
    Call closeclient()     '调用关机程序 
End If 
End Sub 
接下来讲解客户端关机程序closeclient()。 
2.客户端关闭2000/XP操作系统 
目前计算机系统多为Windows 2000和Windows XP。Windows 98系统下的关机比较容易,只需要直接调用关闭计算机函数ExitWindowEx就可以了,而在Windows 2000系统下的调用这个函数只能“注销”而不能实现系统关机。在Windows 2000系统实现关机操作需得到SHUTDOWN许可,得到SHUTDOWN许可需要调用相应的API函数,具体过程如下: 
①首先得到当前程序的进程句柄; 
②使用这个进程句柄得到当前程序的访问标记; 
③生成TOKEN_PRIVILEGES结构; 
④有了TOKEN_PRIVILEGES结构后再获得SHUTDOWN权限; 
⑤最后使用ExitWindowEx函数进行相关操作。 
(1)相关的API函数 
1)获得当前进程伪句柄函数GetCurrentProcess,函数声明如下: 
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long 
2)取得程序访问标记函数OpenProcessToken,函数声明如下: 
    Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long 
3)查找进程权限函数LookupPrivilegeValue,函数声明如下: 
    Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long 
    4)获得关机权限函数AdjustTokenPrivileges,函数声明如下: 
    Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long 
    5)关机函数ExitWindowEx 
    用于关机操作的一些常数如表2所示。 
表2 
| 
 常数值  | 
 字符标识  | 
 作用  |  
| 
 &H20  | 
 TOKEN_ADJUST_PRIVILEGES  | 
 关机权限标识  |  
| 
 &H8  | 
 TOKEN_QUERY  | 
 标识查询  |  
| 
 &H2  | 
 SE_PRIVILEGE_ENABLED  | 
 私有进程有效  |  
| 
 0  | 
 EWX_LOGOFF  | 
 终止进程系统注销  |  
| 
 1  | 
 EWS_SHUTDOWN  | 
 关闭系统电源  |  
| 
 2  | 
 EWS_REBOOT  | 
 重新启动  |  
| 
 4  | 
 EWS_FORCE  | 
 强行终止没有响应的进程  |   			
				 |