创造服务
A. 酒店服务行业中,“惊喜服务”的含义如何为客人创造“惊喜
一些细节服务的重视.如对客人的喜好进行记录,安排给客人习惯的老位置,喜爱的食物等,对客人特殊要求的记录.
B. 如何创建系统服务
1、修改注册表 主要有两种方法…… 还有一个好用的命令:sc delete+服务名
在“开始→运行”中键入“regedit.exe”,打开“注册表编辑器”,展开分支“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”,在右侧窗格中显示的就是本机安装的服务项。
如果要新建服务,只须点击“编辑→新建→项”,然后为此项命名,如“test”;然后右击该项,选择“新建→字符串值”或“新建→DWORD值”即可。添加一个服务项目具体需要添加的键值如下:
“DisplayName”,字符串值,对应服务名称;
“Description”,字符串值,对应服务描述;
“ImagePath”,字符串值,对应该服务程序所在的路径;
“ObjectName”,字符串值,值为“LocalSystem”,表示本地登录;
“ErrorControl”,DWORD值,值为“1”;
“Start”,DWORD值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止;
“Type”,DWORD值,应用程序对应10,其它对应20。
另外,还要在“test”项下新建一个“Enum”项。按照以上步骤添加QQ程序为服务,重新启动计算机后,打开“服务”窗口,就可以看到刚才添加的QQ服务。
如果要删除某项服务,只要删除注册表的中相关键值即可,本例中要删除QQ服务,直接删除“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\test”分支即可。
2、使用SC命令 (不错,使用也简单)
先进入命令行 (开始——〉运行——输入CMD),直接输入SC可以查看关于该命令的帮助。
如果要删除一个系统服务,可以使用 SC delete [服务名称],比如删除messager服务,输入SC DELETE MESSAGER。
SC使用这样的语法:
1. SC [Servername] command Servicename [Optionname= Optionvalue]
2. SC [command]
这里使用第一种语法使用SC,使用第二种语法显示帮助。
下面介绍各种参数。
Servername
可选择:可以使用双斜线,如\\myserver,也可以是\\192.168.0.1来操作远程计算机。如果在本地计算机上操作
就不用添加任何参数。
Command
下面列出SC可以使用的命令。
config----改变一个服务的配置。(长久的)
continue--对一个服务送出一个继续控制的要求。
control----对一个服务送出一个控制。
create----创建一个服务。(增加到注册表中)
delete----删除一个服务。(从注册表中删除)
EnumDepend--列举服务的从属关系。
GetDisplayName--获得一个服务的显示名称。
GetKeyName--获得一个服务的服务键名。
interrogate--对一个服务送出一个询问控制要求。
pause----对一个服务送出一个暂停控制要求。
qc----询问一个服务的配置。
query----询问一个服务的状态,也可以列举服务的状态类型。
start----启动一个服务。
stop----对一个服务送出一个停止的要求。
Servicename
在注册表中为service key制定的名称。注意这个名称是不同于显示名称的(这个名称可以用net start和服务控
制面板看到),而SC是使用服务键名来鉴别服务的。
Optionname
这个optionname和optionvalue参数允许你指定操作命令参数的名称和数值。注意,这一点很重要在操作名称和等
号之间是没有空格的。一开始我不知道,结果………………,比如,start= optionvalue,这个很重要。
optionvalue可以是0,1,或者是更多的操作参数名称和数值对。
如果你想要看每个命令的可以用的optionvalue,你可以使用sc command这样的格式。这会为你提供详细的帮助。
Optionvalue
为optionname的参数的名称指定它的数值。有效数值范围常常限制于哪一个参数的optionname。如果要列表请用
sc command来询问每个命令。
Comments
很多的命令需要管理员权限,所以我想说,在你操作这些东西的时候最好是管理员。呵呵!
当你键入SC而不带任何参数时,SC.exe会显示帮助信息和可用的命令。当你键入SC紧跟着命令名称时,你可以得
到一个有关这个命令的详细列表。比如,键入sc create可以得到和create有关的列表。
但是除了一个命令,sc query,这会导出该系统中当前正在运行的所有服务和驱动程序的状态。
当你使用start命令时,你可以传递一些参数(arguments)给服务的主函数,但是不是给服务进程的主函数。
SC create
这个命令可以在注册表和服务控制管理数据库建立一个入口。
语法1
sc [servername] create Servicename [Optionname= Optionvalue]
这里的servername,servicename,optionname,optionvalue和上面的一样,这里就不多说了。这里我们详细说
明一下optionname和optionvalue。
Optionname--Optionvalue
描述
type=----own, share, interact, kernel, filesys
关于建立服务的类型,选项值包括驱动程序使用的类型,默认是share。
start=----boot, system, auto, demand, disabled
关于启动服务的类型,选项值包括驱动程序使用的类型,默认是demand(手动)。
error=----normal, severe, critical, ignore
当服务在导入失败错误的严重性,默认是normal。
binPath=--(string)
服务二进制文件的路径名,这里没有默认值,这个字符串是必须设置的。
group=----(string)
这个服务属于的组,这个组的列表保存在注册表中的ServiceGroupOrder下。默认是nothing。
tag=----(string)
如果这个字符串被设置为yes,sc可以从CreateService call中得到一个tagId。然而,SC并不显示这个标签,所
以使用这个没有多少意义。默认是nothing
depend=----(space separated string)有空格的字符串。
在这个服务启动前必须启动的服务的名称或者是组。
obj=----(string)
账号运行使用的名称,也可以说是登陆身份。默认是localsystem
Displayname=--(string)
一个为在用户界面程序中鉴别各个服务使用的字符串。
password=--(string)
一个密码,如果一个不同于localsystem的账号使用时需要使用这个。
Optionvalue
Optionname参数名称的数值列表。参考optionname。当我们输入一个字符串时,如果输入一个空的引用这意味着
一个空的字符串将被导入。
Comments
The SC CREATE command performs the operations of the CreateService API function.
这个sc create命令执行CreateService API函数的操作。详细请见CreateService。
例1
下面这个例子在一台叫做(\\myserver)的计算机上为一个叫“NewService”的服务建立的一个注册表登记。
sc \\myserver create NewService binpath= c:\winnt\system32\NewServ.exe
按照默认,这个服务会建立一个WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START启动方式。这将不会有任何从属
关系,也将会按照localsystem安全上下关系来运行。
例2
下面这个例子将在本地计算机上,建立一个服务,它将会是一个自动运行服务,并且运行在他自己的进程上。它
从属于TDI组和NetBios服务上。注意,你必须在从属中间增加一个空格的引用。
sc create NewService binpath= c:\winnt\system32\NewServ.exe type= own
start= auto depend= "+TDI Netbios"
例3
服务开发者可以通过临时改变二进制路径(影像路径)的方式来将这个服务运行在内核调试器的上下关系中。下
面这个例子就可以让我们看到如何改变服务的配置。
sc config NewService binpath= "ntsd -d c:\winnt\system32\Newserv.exe"
这个例子会引起服务控制管理器调用ntsd.exe使用下例的参数字符串:
"-d c:\nt\system32\NewServ.exe"
当系统装入newserv.exe时ntsd将会转而打断调试器,所以断点可以被设置在服务代码里。
SC QC
这个SC QC“询问配置”命令可以列出一个服务的配置信息和QUERY_SERVICE_CONFIG结构。
语法1
sc [Servername] qc Servicename [Buffersize]
Parameters
servername和servicename前面已经介绍过了,这里不再多说。
Buffersize,可选择的,列出缓冲区的尺寸。
Comments
SC QC命令显示了QUERY_SERVICE_CONFIG结构的内容。
以下是QUERY_SERVICE_CONFIG相应的区域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName
例1
下面这个例子询问了在上面例子中建立的“NewService”服务的配置:
sc \\myserver qc NewService
sc显示下面的信息:
SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:\winnt\system32\NewServ.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : NewService
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
NewService有能力和其他的服务共享一个进程。但是它不是自动启动的。二进制文件名是NewServ.exe。这个服务
不依靠与其它的的服务,而且运行在lcoalsystem的安全上下关系中。这些都是调用QueryServiceStatus基本的返
回,如果还需要更多的细节届时,可以看看API函数文件。
SC QUERY
SC QUERY命令可以获得服务的信息。
语法:
sc [Servername] query { Servicename | Optionname= Optionvalue... }
参数:
servername, servicename, optionname, optionvalue不在解释。只谈一下这个命令提供的数值。
Optionname--Optionvalue
Description
type=----driver, service, all
列举服务的类型,默认是service
state=----active, inactive, all
列举服务的状态,默认是active
bufsize=--(numeric value)
列举缓冲区的尺寸,默认是1024 bytes
ri=----(numeric value)
但开始列举时,恢复指针的数字,默认是0
Optionvalue
同上。
Comments
SC QUERY命令可以显示SERVICE_STATUS结构的内容。
下面是SERVICE_STATUS结构相应的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint
在启动计算机后,使用SC QUERY命令会告诉你是否,或者不是一个启动服务的尝试。如果这个服务成功启动,WIN32_EXIT_CODE区间会将会包含一个0,当尝试不成功时,当它意识到这个服务不能够启动时,这个区间也会提供一个退出码给服务。
例子
查询“NewService"服务状态,键入:
sc query NewService
显示一下信息:
SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
注意,这里存在一个给这个服务的退出码,即使这个服务部不在运行,键入net helpmsg 1077,将会得到对1077错误信息的说明:
上次启动之后,仍未尝试引导服务。
所以,这里我想说一句,希望大家可以活用net helpmsg,这会对你的学习有很大的帮助。
下面在对SC query的命令在说明一下:
列举活动服务和驱动程序状态,使用以下命令:
sc query
显示messenger服务,使用以下命令:
sc query messenger
只列举活动的驱动程序,使用以下命令:
sc query type= driver
列举Win32服务,使用以下命令:
sc query type= service
列举所有的服务和驱动程序,使用以下命令:
sc query state= all
用50 byte的缓冲区来进行列举,使用以下命令:
sc query bufsize= 50
在恢复列举时使用index=14,使用以下命令:
sc query ri=14
列举所有的交互式服务,使用以下命令:
sc query type= service type= interact
C. 服务创造价值,管理创造效益什么意思
笔者经常受公司之托进行财务管理咨询,最近几家公司的财务总监都不约而同地提出了这样一个问题:新经济形势下,财务管理在公司价值创造活动中应该扮演什么角色,怎样才能真正起到核心作用呢?笔者认为,只有明确了财务工作的宗旨、扮演了正确的角色、取得了工作实绩才能赢得财务管理应有的地位。第一,财务管理应成为公司战略规划的主要参与者。战略规划决定了企业未来的发展方向,关系到企业的兴衰成败。而企业主要是一个经济价值创造的主体,关键战略一般事关财务问题。这就要求公司的财务管理工作关注公司战略规划,为公司战略产生理想的财务影响起到参谋和支持作用。随着经营管理模式的国际化,战略规划和战略指导的任务越来越多地落到了公司财务管理者身上,这就要求财务人员必须充分运用其综合管理能力确保战略计划的全面性和科学性;充分运用财务规划与决策工具辅助战略规划,确保公司战略的经济性与创值性,确保公司发展的正确方向。第二,财务管理应成为公司创造价值的协助者。企业从原材料采购到产品生产,从存货储备到产品销售,每一个环节的经营活动都与价值变动相联系。财务管理者应发挥自己的专业优势,为各个经营环节的决策服务,提高创造价值的能力和水平。具体来说,财务管理者可以在批量采购、最优库存、自产与外包、更新与维修、生产批量、销售定价与销售政策、收款策略、商业信用与供应链金融等方面协助经营管理者进行科学决策,从而确保企业各个经营环节的价值创造。第三,财务管理应成为公司创造价值的保护者。随着科学技术的不断发展以及经营环境的不断变化,企业面临着内外部多方面的风险,任意一项风险的发生都会毁损企业的价值。这就需要企业建立合理、有效的内部控制和风险防范与预警机制以对风险进行评估、防范和监控。在企业的内部控制建设中,企业领导人是关键,财务管理是核心。企业要围绕防范价值毁损这个关键目标,构建起内部控制与风险防范体系,而财务管理在内控体系建设过程中要发挥主导作用。第四,财务管理应成为公司创造价值的促进者。公司的价值创造和其他活动一样,要想产生理想的效果就需要一定的激励机制。一般来说,激励机制一旦形成就会内在地作用于企业价值创造系统本身,使企业的价值创造机能处于良性的运行状态。公司财务管理要参与相应的经济责任考核和薪酬激励以及各项奖惩制度的制定,完善与价值创造相关的激励机制,并通过经济责任考核以及各种奖惩措施促进公司的价值创造活动。第五,财务管理应成为新环境下的价值直接创造者。波特在《竞争优势》中提出了价值链的概念。他把企业内外价值增加的活动分为基本活动和支持性活动,基本活动涉及企业生产、销售、进料、发货、售后服务。支持性活动涉及人事、财务、计划、研究与开发等。基本活动创造价值,辅助活动保证基本活动的运行。在现代经济环境下,财务管理除了作为辅助活动支持企业的各项创值活动之外,还可以利用现代经营环境发挥创造价值的功能。比如,企业可以在财务管理活动中通过降低成本费用来实现价值创造:利用多种结算手段降低结算成本;对外统一筹资降低资金使用成本;建立外汇资金平台,统一结售汇,降低企业用汇成本;进行资金集中管理,降低流动性成本;进行税收筹划,降低税收成本;积极增加现金流入创造价值;科学利用闲散资金进行投资,获取现金流流入;用好政府优惠政策,获得补贴收入;等等。总之,企业财务管理的地位是要靠自己的工作成绩来确立的。
D. VC 如何创建服务
这是我前几天写的一个例子:我给你注释一下,如果还不懂,就加我:Q11(59)Q(59)903
// ProcApp.cpp : 定义控制台应用程序的入口点。
//
#pragma once
#include "stdafx.h"
#include <windows.h>
#include <winioctl.h>
//这是我自定义的类型,和你问和问题无关,你就把它当成一个类型就是了
typedef struct _CALL_BACK
{
HANDLE pParentId;
HANDLE pProcessId;
BOOLEAN bCreate;
}CALLBACKINFO,*PCALLBACKINFO;
//这个定义也和创建服务无关。你就把它当成一个常量吧
#define IOCTL_NTPROCDRV_GET_PROCINFO CTL_CODE(FILE_DEVICE_UNKNOWN,0x0800,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t szSymlName[]=L"slNTProcDrvYH";
wchar_t szDriverPath[MAX_PATH];
wchar_t *p;
::GetFullPathName(L"服务.sys",MAX_PATH,szDriverPath,&p);
//上面这个是得到服务的可执行文件路径,一个服务总有一个可执行文件的
//打开服务管理器,第一个参数是计算机名,本机就用NULL,第二个是数据库名
//默认数据库就用NULL,第三个是访问权限。这个API返回服务管理器句柄。
SC_HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (!scm)
{
printf("OpenSCManager失败!");
return 0;
}
//这个是创建服务,它的第一个参数是服务管理器的句柄,第二个参数是服务
//名,第三个参数是服务的显示名,第四个参数是权限设置,第五个是服务类
//型,其它的你看一下MSDN吧
SC_HANDLE scs=CreateService(scm,szSymlName,szSymlName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szDriverPath,NULL,0,NULL,NULL, NULL);
if (!scs)
{
int nError=GetLastError();
if (nError==ERROR_SERVICE_EXISTS||nError==ERROR_SERVICE_MARKED_FOR_DELETE)
{
scs=OpenService(scm,szSymlName,SERVICE_ALL_ACCESS);
}
if (!scs)
{
printf("CreateService失败!%d",GetLastError());
return 0;
}
}
//这里是启动服务
if (!::StartService(scs,0,NULL))
{
int nError=::GetLastError();
if (nError!=ERROR_SERVICE_ALREADY_RUNNING)
{
printf("StartService失败!%d\n",nError);
CloseServiceHandle(scs);
CloseServiceHandle(scm);
return 0;
}
}
//下面的和你的问题没有关了,你可以不用看了,但是后面有个关闭句柄的,不要忘了
HANDLE hDriver=::CreateFile(L"\\\\.\\slNTProcDrv",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hDriver==INVALID_HANDLE_VALUE)
{
printf("打开设备失败!");
return 0;
}
HANDLE hProcessEvent=::OpenEvent(SYNCHRONIZE,FALSE,TEXT("Global\\NTProcDrvProcessEvent"));
if (!hProcessEvent)
{
printf("OpenEvent失败!%d\n",::GetLastError());
CloseServiceHandle(scs);
CloseServiceHandle(scm);
return 0;
}
CALLBACKINFO callbackinfo,callbacktemp={0};
while(::WaitForSingleObject(hProcessEvent,INFINITE)==WAIT_OBJECT_0)
{
DWORD nBytsReturn;
BOOL bRet=::DeviceIoControl(hDriver,IOCTL_NTPROCDRV_GET_PROCINFO,NULL,0,(LPVOID)&callbackinfo,sizeof(callbackinfo),&nBytsReturn,NULL);
if (bRet)
{
if (callbackinfo.bCreate!=callbacktemp.bCreate||callbacktemp.pParentId!=callbackinfo.pParentId||callbackinfo.pProcessId!=callbacktemp.pProcessId)
{
if (callbackinfo.bCreate)
{
printf("有进程被创建,PID:%d\n",callbackinfo.pProcessId);
}
else
{
printf("有进程被结束,PID: %d\n",callbackinfo.pProcessId);
}
}
}
else
{
printf("进程信息获取失败!");
break;
}
}
CloseHandle(hDriver);
SERVICE_STATUS ss;
::ControlService(scs,SERVICE_CONTROL_STOP,&ss);
::DeleteService(scs);
::CloseServiceHandle(scs);
::CloseServiceHandle(scm);
return 0;
}
E. 如何创建用户定义的服务
在 MS-DOS 命令提示符 (运行 cmd.EXE),请键入以下命令︰
路径\INSTSRV。EXE 我的服务 路径\SRVANY。EXE
其中路径是 Windows NT 资源工具包 (即 C:\RESKIT)的驱动器和目录,我的服务是您创建的服务的名称。
示例︰
C:\Program Files\Resource Kit\Instsrv.exe 记事本 C:\Program Files\Resource Kit\Srvany.exe
注意:若要验证该服务已被正确创建,检查注册表以确认下的 ImagePath 值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名称
被设置为指向 SRVANY。EXE如果此设置不正确,服务将停止,不久之后它开始并返回事件 ID 7000服务名称未能启动。
运行注册表编辑器 (Regedt32.exe)and 找到下面的子项︰
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ < 我服务 >
从编辑菜单上,单击添加项。
关键名称︰ 参数
类︰ < 空 >
选择参数密钥。
从编辑菜单上,单击添加值。
值名称︰ 应用程序
数据类型︰ REG_SZ
字符串︰ < 路径 > \ < application.ext >
其中 < 路径 > \ < application.ext > 是驱动器和包括扩展名 (如 C:\WinNT\Notepad.exe) 的应用程序可执行文件的完整路径
关闭注册表编辑器。
默认情况下,新创建的服务它配置为在系统重新启动时自动运行。若要更改此设置为手动,从控制面板运行服务小程序并启动值更改为手动。可以以几种方式之一启动服务设置为手动︰
-从控制面板中的服务小程序
-从 MS-DOS 命令提示符下,键入以下命令︰
NET START < 我服务 >
-使用 Sc.exe 实用工具,资源工具包中。从 MS-DOS 命令提示符下键入︰
< 路径 > \Sc.exe 开始 < 我服务 >
其中 < 路径 > 是驱动器和 Windows NT 资源工具包 (即 C:\Reskit) 的目录。
F. 用cmd创建服务的命令的什么
假设你的xx.exe位于C:\windows\system32目录:
以下代码于参考地址,start= auto 已经设置为自动启动了,还请自行修改路径,服务名称等等。
====================================================
@ECHO OFF
rem 创建服务 ABDD
SC CREATE ABDD binPath= "C:\windows\system32\xx.exe" START= auto DISPLAYNAME= "ABCD EFGHSERBER" TYPE= own
rem 设置描述信息为 “提供三种管理服务,提供数据供应。”
SC description ABDD "提供三种管理服务,提供数据供应。"
rem 启动服务 ABDD 也就是将这个服务的状态标志成了 “启动” 状态
SC START ABDD
PAUSE
G. Linux 下如何创建一个服务
Linux系统能提供强大可靠的网络服务,并有管理程序对服务进行管理。例如我们熟悉的Web、FTP和电子邮件等,它们既可以单独运行,也可以被守护进程inetd调用,而且运行得都非常好。但我们不能仅停留在赞叹中,下面就给出两个服务程序程序和一个客户程序的例子,介绍服务程序和客户程序之间是如何沟通的。另外还要编辑配置一些文件,让服务程序也能接受服务管理程序管理。
这两个服务程序功能相同,但一个是独立服务程序,另一个是被inetd调用的服务程序。这是TCP/IP网络服务的两大类,这里将两个程序放在一起是为了比较程序结构和运行方式。两服务程序都在Red Hat Linux 7.1和TurboLinux 7.0上调试通过。
独立服务器
TCP和UDP是两大TCP/IP数据传输方式,套接口是建立服务器客户机连接的机制,首先介绍它们建立通信联系的过程,然后给出一个TCP服务程序例子。
1.TCP套接口通信方式
对于TCP服务器端,服务程序首先调用建立套接口的函数socket(),然后调用绑定服务IP地址和协议端口号函数bind()。绑定成功后调用被动监听函数listen()等待客户连接,还要调用获取连接请求函数accept(),并一直阻塞到客户连接请求的到达,这个函数获取客户机IP地址和协议端口号。
对于TCP客户端,客户程序启动后后调用建立套接口函数socket(),然后调用连接函数connect(),此函数与服务器通过三次握手建立连接。
服务器和客户机建立连接后,就可以使用读函数read()和写函数write()收发数据了。数据交换完成后便各自调用关闭套接口函数close()删除套接口。TCP套接口通信方式见图1所示。
图1 TCP套接口通信方式
2.UDP套接口通信方式
UDP程序与TCP的区别是无需建立连接。服务器首先启动,然后等待用户请求。客户机启动后便直接向服务器请求服务,服务器接到请求后给出应答。
对于UDP服务器端,服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口号函数bind()。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据。
对于UDP客户端,客户机程序启动后调用套接口函数socket(),然后调用sendto()向服务器发送数据,调用recvfrom()接收服务器数据。
双方数据交换成功后,各自调用关闭套接口函数close()关闭套接口。UDP套接口通信方式见图2所示。
图2 UDP套接口通信方式
下面给出独立服务程序的例子。这个程序虽然简单,但是与复杂程序有着相同的结构。
//程序名:server.c
//功能:服务器从客户机读入一个字符,并将排在此字符后面的字符回送客户机
//服务器端口:9000
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int pid; //用于存放fork()执行结果
int server_sockfd,client_sockfd; //用于服务器和客户机套接口描述符
int bind_flag,listen_flag; //用于存放bind()和listen()执行结果
int server_address_length,client_address_length; //作为服务器客户机地址长变量
struct sockaddr_in server_address; //作为服务器地址结构变量(含地址和端口)
struct sockaddr_in client_address; //作为客户机地址结构变量(含地址和端口)
if((pid=fork())!=0) //用fork()产生新进程
exit(0) ;
setsid() ; //以子进程开始下面的程序
函数socket(),创建一个套接口,成功则返回套接口描述符。
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd<0)
{
printf(“socket error /n”);
exit(1);
}
server_address.sin_family=AF_INET;
函数htonl()用于将32位主机字节顺序转换为网络字节顺序,其中参数INADDR_ANY表示任何IP地址。
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
函数htons()用于将16位主机字节顺序转换为网络字节顺序,其中的参数是绑定的端口号,读者可根据环境自行改动,目的是不与其它服务端口冲突。
server_address.sin_port=htons(9000);
server_address_length=sizeof(server_address);
函数bind()用于绑定本地地址和服务端口号,若调用成功返回值为0。
bind_flag=bind(server_sockfd,/
(struct sockaddr *)&server_address,/
server_address_length);
if(bind_flag<0)
{
printf(“bind error /n”);
exit(1);
}
函数listen(),指明服务器的队列长度,被动等待客户连接,调用成功返回值为0。
listen_flag=listen(server_sockfd,5);
if(listen_flag<0)
{
printf(“listen error /n”);
exit(1);
}
while(1)
{
char ch;
函数accept()等待和获取用户请求,为每个新连接请求创建一个新的套接口,调用成功返回新套接口描述符。
client_sockfd=accept(server_sockfd,/
(struct sockaddr *)&client_address,/
&client_address_length);
函数read()和write()用于在服务器和客户机之间传送数据,调用成功返回读和写的字节数。
函数close(),用于程序使用完一个套接口后关闭套接口,调用成功返回值0。其中的参数为accept()创建的套接口的描述符client_sockfd。
read(client_sockfd,&ch,1);
printf(“cli_ch=%c”,ch);
ch++;
write(client_sockfd,&ch,1);
close(client_sockfd);
}
}
程序完成后就可以使用命令进行编译。在命令行中输入“gcc -o server server.c”,将server.c编译成可执行程序server,这时便可用客户程序进行测试。在命令行执行“./server”启动服务程序,执行“netstat -na”查看有无server的服务端口。如果存在,则执行下面编写的客户程序“./client”。不过这仅是手工启动的方法,下面给出用服务管理程序管理server程序的方法。只要在目录/etc/rc.d/init.d下放入服务程序的脚本就能被服务程序读到。在命令行执行“touch server”创建文件server,并将文件属性改成可执行。在管理程序中并不能看到此服务名,脚本文件必须有一些结构才能被管理程序认为是服务程序脚本。
为了减少工作量,拷贝/etc/rc.d/init.d下脚本httpd,将拷贝脚本名命名为server,然后对其编辑。
(1)执行“cp httpd server”。
(2)用文本编辑器vi(其它编辑器亦可)将server打开进入编辑状态。首先用字符串server替换httpd。然后找到daemon server行,如果编写的程序放在变量PATH目录中,不需要修改此行;如果把服务程序放在其它目录中,就要写服务的全路径。例如程序在/root的目录中,就要写成daemon /root/server,还要删除“rm -f /var/run/server.pid”这一行。
(3)执行“chmod 755 server”,将server属性设定为可执行。
此时就可以用chkconfig、ntsysv等工具,在希望的运行级中增加这个新服务程序,然后测试客户机与服务器能否通信。
被xinetd调用的服务程序
在Linux系统中,有很多服务是被xinetd(较早版本使用的是inetd)超级守护服务器启动的。其实凡是基于TCP和UDP的服务都可使用超级守护进程启动,只是在服务量很大影响效率的情况下不被采用。
1.依赖xinetd启动的服务建立通信过程
为了与独立服务器程序比较,我们看一下依赖xinetd的服务器是如何启动的。
(1)xinetd启动时读取/etc/xinetd目录中的文件(早期版本为/etc/inetd文件),根据其中的内容给所有允许启动的服务创建一个指定类型的套接口,并将套接口放入select()中的描述符集合中。
(2)对每个套接口绑定bind(),所用的端口号和其它参数来自/etc/xinetd目录下每个服务的配置文件。
(3)如果是TCP套接口就调用函数listen(),等待用户连接。如果是UDP套接口,就不需调用此函数。
(4)所有套接口建立后,调用函数select()检查哪些套接口是活动的。
(5)若select()返回TCP套接口,就调用accept()接收这个连接。如果为UDP,就不需调用此函数。
(6)xinetd调用fork()创建子进程,由子进程处理连接请求。
◆ 子进程关闭所有其它描述符,只剩下套接口描述符。这个套接口描述符对于TCP是accept()返回的套接口,对于UDP为最初建立的套接口。然后子进程连续三次p()函数,将套接口描述符复制到0、1和2,它们分别对应标准输入、标准输出和标准错误输出,并关闭套接口描述符。
◆ 子进程查看/etc/xinetd下文件中的用户,如果不是root用户,就用调用命令setuid和setgid将用户ID和组ID改成文件中指定的用户。
(7)对于TCP套接口,与用户交流结束后父进程需要关闭已连接套接口。父进程重新处于select()状态,等待下一个可读的套接口。
最后调用配置文件中指定的外部服务程序,外部程序启动后就可与用户进行信息传递了。
2.为xinetd编写专门的服务程序
除了独立服务程序能被xinetd启动外,还可以为xinetd编写专门的程序。此处的例子程序与上面server.c功能相同。不过两者的程序区别是很大的,此例的代码仅相当于上面传输数据的部分。我们还将程序名定为server.c,所以不能放在相同目录中,同名仅是为了和上面程序对照。
#include "unistd.h"
int main()
{
char ch;
read(0,&ch,1);
ch++;
write(1,&ch,1);
}
将程序编译成可执行文件,并做些设置就可被xinetd启动。注意不要和上面的独立服务程序server一起启动,因为客户程序写得比较简单,访问的是固定端口,服务器都设成了相同的端口号。
(1)编辑/etc/services文件,在行末增加一条记录:
server 9000/tcp
(2)在目录/etc/xinetd.d下编写文件server,内容为:
service server
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /home/test/server (此处设置成自己程序所在的目录)
}
如果使用的是较早版本,则需在/etc/inetd.conf文件中添加下面的行:
server tcp nowait root /path/to/yourdirectory/server
(3)执行/etc/rc.d/initd.d/xinetd restart重新启动xinetd服务器。早期版本执行/etc/rc.d/initd.d/inetd restart重新启动inetd。
(4)执行netstat -an查看有没有server程序使用的端口号,如果有就可使用下面客户机程序进行测试了。
客户机程序
下面就客户机函数做一简单介绍。
//程序名client.c
/*功能:从客户的控制台输入一个字符,然后将这个字符送到服务器,并将服务器返回的字符显示出来*/
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int sockfd;//
int address_len;
int connect_flag;
struct sockaddr_in address;
int connect_result;
char client_ch,server_ch;
函数socket()用于建立一个套接口,创建成功返回套接口描述符。
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf(“sockfd error /n”);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(“192.168.0.1”);/*读者根据自己环境改成服务器地址*/
address.sin_port=htons(9000);
address_len=sizeof(address);
函数connect()用于与服务器建立一个主动连接,调用成功返回值为0。
connect_flag=connect(sockfd,(struct sockaddr *)&address,address_len);
if(connect_flag==-1)
{
perror(“client”);
exit(1);
}
printf(“Input a character :”);
函数scanf()用于从控制台输入一个字符,并将字符存入client_ch的地址。函数write()和read()用于传输数据。函数printf()在客户机屏幕上显示服务器传回的字符。函数close()关闭套接口。
scanf(“%c”,&client_ch);
write(sockfd,&client_ch,1);
read(sockfd,&server_ch,1);
printf(“character from server : %c/n”,server_ch);
close(sockfd);
exit(0);
}
执行命令“gcc -o client client.c”,将client.c编译成client。执行“./client”,在程序提示下输入一个字符,就能看到服务器传回的字符。
以上介绍的仅是简单的例子。平时见到的服务程序远比它复杂,而且很多是多协议服务程序或是多协议多服务程序。多协议服务程序就是在main()中分别创建供服务的TCP和UDP套接口。为每个服务分别写出相应程序好处是便于控制,但是这样每个服务都启动两个服务器,而它们的算法响应是一样的,就要耗费不必要的资源,并且出了问题排错也较困难。多服务是将不同的服务集成在一起由一个程序完成,可用一个数组表示服务,数组中的每一项表示某协议某服务的一种,这样很容易扩展程序的服务功能。
H. 服务业是如何创造价值的
对服务劳动是否创造价值的思考[摘要] 服务劳动是否创造价值一直是我国学者争论的焦点。本文在综述不同观点的基础上,提出自己的看法,即要用发展的眼光认识商品价值的内涵。接着本文将服务分成生产者服务、消费者服务和分配服务并分别论述了它们的价值形成过程。[关键词] 服务 劳动 价值20世纪90年代初期,发达国家国民生产总值中服务的比重占60%-70%,中等发达国家也达到50%;在国际贸易领域,服务贸易流量约占全球贸易总额的1/4,且有明显的增长趋势;[1]在就业方面,服务业在世界发达国家就业量占2/3左右。[2]可见,随着世界各国经济和产业结构的调整,服务对国民经济的发展变得越来越重要。一、 文献综述与本文问题的提出虽然服务的重要性得到了充分的肯定,但是服务价值问题一直是学术界争论不休的理论问题。对于服务价值问题,学术界争论的焦点在于服务劳动的价值创造问题,即服务劳动是否创造了价值。对于服务劳动是否创造了价值,学术界主要存在三种观点:服务劳动不创造价值、部分服务劳动创造了价值和服务劳动创造价值。 服务劳动不创造价值的观点的支持者大都认为只有生产物质产品的劳动才能创造价值。吴宣恭(2002)认为活劳动是价值的唯一源泉,产权和交换、分配过程不能创造价值,而只能把已经创造出来的价值转移给相关的所有者,成为他们的收入。胡均(2002)认为只有物质生产领域的劳动才创造价值,非物质生产领域的劳动虽然重要,但并不创造价值,承认非生产性劳动创造价值,不仅不是肯定其重要性,反而是贬低了它的重要性。谷清水(2002)对“精神劳动和服务劳动都能创造价值”的5个理论依据一一进行反驳,反对以社会“需要”和“重要”与否衡量一项活动是否创造价值,主张只有既消耗又物化在有用物品中、使劳动处于“凝结”物状态的劳动才创造价值。屈炳祥魏彩霞(2002)以马克思对生产劳动和非生产劳动的划分为依据,对王述英关于“服务劳动也是生产劳动”一说进行反驳,认为服务劳动不是生产劳动,不创造价值。魏新丽肖彬(2004)反对柳新元为将服务纳入创造价值的劳动中而将使用价值的概念扩大的做法,他们认为,使用价值的本质特征在于它的物质性,纯粹的服务劳动参与经济运行是通过介入流通领域和消费领域实现的,参与交换后并没有使价值增大。部分服务劳动创造价值观点的学者大多主张扩大生产劳动的外延,认为创造价值的劳动既包括创造物质财富的劳动,也包括创造精神产品的劳动。程恩富(2001)在提出并论证“新的活劳动价值一元论”的基础上主张将非物质生产领域中一些部门劳动者的劳动纳入创造价值的范畴。他认为,能够提供文化商品(精神商品)的劳动、直接为生产性企业提供某种生产性服务的非物质生产部门的劳动以及与劳动力这一特殊商品的生产和再生产直接有关的非物质生产劳动都创造价值。郭小鲁(2001)反对根据国民经济核算体系中国内生产总值包含服务劳动的价值得出服务劳动创造价值的结论,他认为物质产品的生产者在生产商品过程中购买的服务劳动是价值创造的一个环节,而唱歌、咨询服务、金融服务等劳动结果不是有形商品的服务劳动从属于物质产品的生产,只具有交换价值但不创造价值,并通过构造经济社会模型对此进行说明。卫兴华(2004)主张要适应社会的发展,超越物质生产的范围,拓宽生产劳动和创造价值的劳动的范围,并将社会所需的劳动分为物质生产劳动、精神生产劳动、商业和服务劳动和社会公务劳动四类。精神生产劳动生产精神财富,有的可以创造价值如出版书籍、科技发明、建筑设计,有的则不能创造价值如教师讲课、舞蹈表演、艺术家演出等。商业和服务劳动有的创造价值如金融业、保险业、等商业性服务,有的不创造价值如机关、学校等非商业性服务和歌舞厅纯粹娱乐型服务。社会公务劳动不创造价值。服务劳动创造价值的观点的支持者较多。李江帆(1997)剖析了否定服务劳动创造价值的流行观点如“价值转移说”、“国民收入再分配说”及“非生产劳动说”,从反面论证了服务劳动创造价值的论点。陈宪(2003)通过劳动价值论的基本观点与西方的效用价值论相结合,沿着实物劳动成果-服务产品-服务产品的使用价值与交换价值-服务产品的价值与价值量的思路论证了服务劳动创造价值。柳新元(2003)通过扩大马克思的使用价值范畴,把独立于主体之外的能够满足主体某种需要的所有客体纳入使用价值范畴的范围内,并证明服务劳动生产了使用价值,进而论证了服务劳动创造价值。韩玉军(2004)通过修正古典理论框架,消除“两分法”把服务纳入了古典价值的范畴,并通过对服务价值的实质进行理论分析得出服务劳动创造价值的结论。这三种类型对行探讨出了在综述了服务劳动的价值创造问题不但会影响到世界对服务及其所创造出的巨大财富的认识和态度,而且会影响到服务价值理论的基础。笔者认为,认为服务劳动不创造价值的学者其实是过于束缚在马克思劳动价值论的框框里面,不能用发展的眼光看待服务劳动。其实马克思本身也是用发展的眼光看待服务劳动的。随着经济社会的发展,人们的价值观念本身也在不断的发生变化,用旧的价值观念理解现代的服务经济现象显然是不合理的。事实上,服务具有多种类型,这些类型之间具有很大的差别,与社会物质生产之间的关系也具有很大差别。在不同的社会发展时期,服务扮演的角色也是有着很大的差别的。布朗宁和辛格尔曼于1975年根据联合国标准产业的规则,将服务产业分为:消费者服务业,如招待与食品服务、私人服务、娱乐与消遣服务、杂项服务;生产者服务,如企业管理服务、金融服务、保险与房地产;分配服务,如运输与贮藏、交通与邮电、批发与零售。认为服务劳动创造价值的学者虽然在理论上给予了论证,但是较少有学者详细分析各类服务劳动是如何创造价值的。因此,本文将结合马克思的劳动价值论和现代价值的内涵,分三种类型探讨服务的价值形成。二、 服务价值内涵的发展(一) 马克思对服务价值的发展古典经济学家有关服务价值的观点受到他们有关价值决定因素的影响。重农主义者和重商主义者及后来的许多古典经济学家都依靠劳动价值学说与交换价值概念来理解和定义服务。斯密在《国民财富的性质和原因的研究》中称:服务生产所使用的劳动并不“将它本身固定或实现在任何特定的物体上……这个物体在那种劳动过程过后仍将持续存在,随后还能够购得等量的劳动”,[3]他把“牧师、律师、医生、文人、演员、歌手、舞蹈家”等服务列入非生产劳动范畴,认为这些服务是没有价值的。马克思对服务价值论进行了一定的发展。马克思的《资本论》主要是考察物质生产领域里的活动,服务业方面只是论述了流通和金融业,并没有涉及其他服务活动领域。马克思认为“资本主义生产在这个领域中的所有这些表现,同整个生产比起来是微不足道的,因此可以完全置之不理。”因此马克思并不认为服务业在国民经济中不重要,而是服务业在当时很不发达。后来马克思在《剩余价值论》一书中,曾明确地指出服务是一个经济范畴。马克思还批评了斯密仅把生产物质产品的劳动看成是创造价值的劳动观点,他指出“劳动的这种物质规定性同劳动作为生产劳动的特性毫无关系”。[4]马克思还指出“对于提供这些服务的生产者来说,服务就是商品。服务有一定的使用价值和一定的交换价值。”[5]马克思还把服务分成可以形成有形产品和不形成有形产品两种,并对两种服务的劳动价值给予了经济学上的肯定。可见马克思也是用发展的和历史的眼光看待服务劳动的。(二)价值内涵的发展随着社会环境、经济技术条件及顾客消费观念的变化,价值的内涵和外延也在变化。马克思对价值定义的实质是无差别的劳动,用社会必要劳动时间来计量。他从经济学的角度,对劳动价值进行高度抽象化,主要是为了揭示生产力与生产关系的内在特征。但是,我们并不能停留在马克思所处的时代来理解现代社会产品或服务的价值内涵。马克思对价值的定义只依附于劳动时间和一般技术水平,没有包含商品交换时的主观需求的认定性。在物质财富有限,对功能的需求和物质供给矛盾凸现的背景下,美国通用电气公司工程师L·D迈尔斯创立了价值工程(VE)/价值分析(VA)技术。他认为:价值是投入的单位成本获得的产出或收益。它反映出价值与成本的密切关系。他认为成本是顾客购买决策的重要权衡因素。在买方市场下,需求不断变化,企业间竞争激烈,Michael E.Porter在《竞争优势》一书中认为,价值是买方愿意为企业提供给他们的产品与服务所支付的价格;价值一般用总收入衡量;“着眼于价值而不是成本,有助于提示竞争优势的来源”。1997年,《精细思想》的作者James P.Womack和Dniel T.Jones认为:“价值是由顾客决定的,是顾客获得满足的度量,可以用具有特定价格、能在特定时间内满足用户需求的特定产出表示”。在“顾客价值”概念凸现的今天,现代市场营销学之父Philip Kotler认为顾客价值是指整体顾客价值与整体顾客成本之间的差额部分,而整体顾客价值是指顾客从给定产品和服务中所期望得到的所有利益。可见商品的价值内涵是随着经济社会的发展而不断演变着。每个时代人们对价值的理解都受到其经济环境的影响,都有着独特的角度。我们怎么还能用马克思时代的价值内涵来理解今天的经济现象呢?三、 服务价值的形成(一) 生产者服务的价值形成一个经济体里的生产者服务的产生在于物质生产的需求,因此生产者服务的提供方和接受方分别是生产者服务企业和物质生产企业。物质生产企业购买某种服务,目的是提高生产效率,获得更多利润。因此该种服务的提供必须能够满足物质生产企业的要求,提高其生产效率,提高其创造的价值。而这种服务提供者的收入是来自于他所服务的物质生产企业。如果从“顾客价值”的概念来理解,那么它的顾客价值是来自于物质生产企业由于接受了服务后创造物质价值速度的加快。马克思的价值理论认为,产品的价值由生产资料的价值(C)、劳动者的工资(V)、剩余价值(M)三部分组成。这三个部分在生产者服务的价值形成中分别表现为:生产者服务企业所用到的固定资产或服务工具的折旧、生产者服务企业员工的工资、生产者服务企业的企业主得到的利润和提交政府的税收。商品的空间形态通常是确定的、有形的,原材料通过劳动者的加工转移到最终产品上。但是,服务的空间形态是不确定的、无形的。服务劳动者加工的对象往往是物质生产者的成品或半成品,或者服务劳动者可以代替物质生产者完成其产品生产的某一工作环节,或者由于服务劳动者的参与,物质生产者的劳动效率得到提高。从生产者服务的对象、过程和结果,我们都不能否认这一项服务的价值存在性。(二) 消费者服务的价值形成有些观点认为,消费者服务只是个人收入的再分配,提供消费者服务的劳动没有给社会创造或加快社会创造物质产品,并不创造价值。这只是站在服务业极不发达的时代狭隘地理解价值的内涵和外延。经济学要研究的主要是社会资源的配置问题。之所以要研究这个问题主要是人类欲望的无限性。人类欲望是无限的,那么人类的需求绝不会局限于物质的需求。人类需求由物质需求向精神需求的升级正是人类社会发展的见证。虽然消费者服务是看不到的,但是可以被感受到。消费者服务可以分为两种:一种是服务接受者为了提升自己的人力资本水平,提高自己的工作效率,从而为自己增加个人收入带来帮助;另一种是服务接受者的物质需求已经得到充分的满足,从而对非物质需求的一种追求。第一种消费者服务其实是生产者服务在以人为单位上的一个缩影。第一种消费服务的顾客价值可以体现为服务接受者人力资本水平的提高,工作效率的提高。而这种提高可以使服务接受者创造更多的物质价值或其他服务价值。由此可见第一种消费者服务通过改变服务接受者,间接地参与了物质部门的价值创造。第二种消费者服务虽然不能增加物质生产创造的价值,但是并不能以狭隘的价值内涵来否定它的价值。马斯洛理论把需求分成生理需求、安全需求、社交需求、尊重需求和自我实现需求五类,依次由较低层次到较高层次。更高级的需求也往往是通过接受第二种消费者服务得到满足的。消费者服务的提供者可以是企业或个人。生产资料的价值主要体现在服务提供者使用的固定资产和工具的折旧上,或服务提供者本人为了具备提供这种服务的能力而花费的成本在其所提供服务上的均摊,或两者的综合。如果服务提供者是企业,劳动者的工资和剩余价值就分别体现为企业员工的工资和企业主的利润和提交政府的税收。如果服务提供者是个人,那么劳动者的工资和剩余价值一起体现在其个人的所得和所提交的个人所得税。(三) 分配服务的价值形成分配服务主要发生在流通领域。马克思的劳动价值论认为流通领域是不会创造价值的。其理由是:无论价值交换过程有多长,它最后都要表现为对使用价值的购买力。其实这种看法是产生于服务业极不发达的时代。在服务业极不发达的时代,人们只看重物质生产环节,领略不到其分配服务的价值。实际上物质商品的流通是需要成本的。如果流通成本太大必然会阻碍物质商品交换环节的完成。物质商品的交换环节如果没办法完成,那么物质商品的交换价值就得不到实现。物质商品的价值如果得不到实现,那么生产者会去生产这种物质商品吗?显然不会。分配服务的功能正好是为了克服商品的流通障碍。发达的分配服务为一个经济体物质生产的发展提供了一个良好的流通环境。分配服务的接受者可以是企业,也可以是个人。当分配服务的接受者是企业时,其顾客价值体现为企业可以扩大其产品的出售,从而扩大其生产,获得更大的利润。当分配服务的接受者是个人时,其顾客价值体现为个人可以获得或更低的成本获得自己需要的产品。而提供分配服务的企业需要投入一定的固定资产或工具,还有劳动力,这体现为其服务的成本。而该企业所得的利润和提交政府的税收,是其分配服务的剩余价值的体现。四、 结论综上所述,价值的内涵是随着社会经济的发展而演变的,我们不能停留在马克思的时代背景,用马克思价值内涵来理解今天的服务价值问题。生产者服务、消费者服务和分配服务领域的劳动都有创造价值,且在服务价值形成过程中有很大的差异。
本文来自: 人大经济论坛(http://www.pinggu.org) 详细出处参考:http://www.pinggu.org/html/2007-3/19/154266.html
I. 怎么创造服务器
1\制作网络克隆镜像:将做好的系统盘,直接挂接在网络克隆服务器上,这里需要注意,系统盘必须设置为从盘,网络克隆程序必须安装在网络克隆服务器的主硬盘中。网络克隆服务器硬盘上必须有足够的硬盘空间,可用挂接第二块硬盘的方法,用于创建克隆镜像文件。
2\将准备好的另外一块硬盘挂在你做好的机器上.之后重新启动到DOS模式,启动GHOST,选择“Local→Disk→To Image
3\选择需要做镜像的系统盘,按回车键选择已经准备好的拥有足够空间的分区(这里我们选择的是第二块物理硬盘)
4\镜像文件备份完成后,我们该建立GHOST服务器了.启动WINDOWS打开GHOSTSRV . EXE文件.其文件可以在GHOST企业版里找到.(其实BIOS维修网站论坛中已经提供下载了)
5\给服务器起一个名字.我起的名字是shenzi 选择克隆客户端,然后选择我们刚才备份到另外一个硬盘的镜像文件,点击接受客户的按扭。系统此时将自动寻找客户端。
6\ 现在我们要做的工作是设置客户端了。 在GHOST文件所在的目录里,我们需要创建一个WATTCP . CFG的文件.此文件是指定IP以及网关的.如果没有此文件GHOST会自动扫描DHCP服务器.不推荐使用DHCP服务器.所以我们用DOS的命令,EDIT建立一个WATTCP . CFG的文件吧. 在GHOST所在的目录里输入 edit空格wattcp .cfg 在EDIT中,我们建立以下内容 IP=你这台机器所指定的IP.为了避免重复,尽量使用机器号. NETMASK=子网掩玛,根据IP规则设置. GATEWAY=网关.就是建立了GHOST服务器的IP地址.
7\建立完成后,将文件保存后,退出EDIT。然后运行8139网卡DOS环境下驱动程序.执行RTSPKT空格0X60,0X60是给网卡的一个中断.这里必须给网卡一个中断.否则是无法驱动你的网卡.我用的中断是0X60.呵呵,其实这只是一种方法,最简单的方法是直接运行GO批处理文件,其为自动加装网卡DOS驱动和GHOST的一个批处理,这样更方便.
8\运行GHOST.选择MULTICASTING9\ 此时系统会询问你服务器名字.在这里输入你起的服务器名字(这里为shenzi).按回车10\ 选择需要恢复的硬盘.按回车11\此时我们去GHOST服务器看看吧,看正常的情况下,服务器已经可以看到了客户机的IP和MAC地址了.等把客户端全部连接上之后,就可以选择开始传送进行网络克隆了.