
用来实现一个UDP服务器
所在单元
IdUDPServer
属性
property Bindings: TIdSocketHandles
用来收集f TIdSocketHandle实例。包含ID_SOCK_DGRAM类型的socket。
property DefaultPort: integer
监听新连接的端口。
property ThreadedEvent: boolean
指示UDP读事件的执行方式。是否以线程的形式执行
property Active: Boolean
是否开始监听。
property Binding: TIdSocketHandle
只读属性。指示读写传送的socket句柄。
property BroadcastEnabled: Boolean
是否广播传送数据。
property BufferSize: Integer
UDP包的尺寸。
property ReceiveTimeout: Integer
从一个服务中读取数据的超时时间。
property LocalName: string
本地计算机名称。
property Version: string
只读属性,用来获取Indy部件的版本号码。
方法
procedure Broadcast(const AData: stringconst APort: integer)
在网络上发送数据到所有的计算机。
unction ReceiveBuffer(var ABufferconst ABufferSize: Integerconst AMSec: Integer =
IdTimeoutDefault): integeroverload
function ReceiveBuffer(var ABufferconst ABufferSize: Integervar VPeerIP: stringvar
VPeerPort: integerAMSec: Integer = IdTimeoutDefault): integeroverload
从远程连接中读取数据
function ReceiveString(const AMSec: Integer = IdTimeoutDefault): stringoverload
function ReceiveString(var VPeerIP: stringvar VPeerPort: integerconst AMSec: Integer =
IdTimeoutDefault): stringoverload
从远程连接中读取数据
procedure Send(AHost: stringconst APort: Integerconst AData: string)
向远程计算机系统发送数据。
procedure SendBuffer(AHost: stringconst APort: Integervar ABufferconst AByteCount:
integer)
向远程计算机系统发送数据
事件
property OnUDPRead: TUDPReadEvent
UDP读取事件发生时执行。
参数
ABinding
接受UDP数据报的socket。
AData
在UDP数据报中接受数据的流。
property OnStatus: TIdStatusEvent
指示当前连接状态的句柄。
参数
aaArgs
用来构造当前状态文本消息的格式化参数。
axStatus
当前连接状态。取值范围与TIdUDPClient类中的OnStatus事件相同。
procedure BeginWork(AWorkMode: TWorkModeconst ASize: Integer = 0)virtual
当OnBeginWork事件触发时执行
AWorkMode可以取的值:
wmRead--从远程连接中读取数据。
wmWrite-- 向远程连接发送数据。
procedure DoWork(AWorkMode: TWorkModeconst ACount: Integer)virtual
当OnWork事件触发时执行。
procedure EndWork(AWorkMode: TWorkMode)virtual
当OnEndWork事件触发时执行。
我写了一个函数在Windows XP SP2下测试通过,可以直接得到状态字符串调用格式很简单,查看某服务状态的最简单方法:
ShowMessage(GetServiceStatusString('Brower'))
将显示Computer Browser服务的运行情况,Computer Browser服务的服务名称是Browser,还有Remote Procedure Call (RPC)服务的名字是RpcSs,Telnet的服务名称是TlntSvr等等
我没使用过mysql和apache服务,因此我无法知道他们的服务名字,但是你可以开始->运行->services.msc然后在服务列表中找到你要的服务,双击它,第一页的最上边就是服务名称,这是服务自己注册的名称,无论使用什么办法,还是要使用服务名称来区别服务
本函数得到是运行状态字符串,明白了程序原理的话,很容易将它转化成数字返回值,需要的话告诉我.函数是独立的,没有使用类库,不需要控件安装,其实就是API实现的,因此效率最高.
uses
WinSvc //引用此单元
function GetServiceStatusString(sServiceName: string): string
var
hService, hSCManager: SC_HANDLE
SS: TServiceStatus
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT)
if hSCManager = 0 then
begin
result := 'Can not open the service control manager'
exit
end
hService := OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS)
if hService = 0 then
begin
CloseServiceHandle(hSCManager)
result := 'Can not open the service(' + sServiceName + ')'
exit
end
if not QueryServiceStatus(hService, SS) then
result := 'Can not query the service status'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
result := 'The service(' + sServiceName + ') continue is pending'
SERVICE_PAUSE_PENDING:
result := 'The service(' + sServiceName + ') pause is pending.'
SERVICE_PAUSED:
result := 'The service(' + sServiceName + ') is paused.'
SERVICE_RUNNING:
result := 'The service(' + sServiceName + ') is running.'
SERVICE_START_PENDING:
result := 'The service(' + sServiceName + ') is starting.'
SERVICE_STOP_PENDING:
result := 'The service(' + sServiceName + ') is stopping.'
SERVICE_STOPPED:
result := 'The service(' + sServiceName + ') is not running.'
else
result := 'Unknown Status'
end
end
CloseServiceHandle(hSCManager)
CloseServiceHandle(hService)
end
IdTCPServer1.active:=falseIdTCPServer1.Bindings.Clear//需要先清除已绑定的.
IdTCPServer1.DefaultPort := 8000
IdTCPServer1.Active := true
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)