1.在台湾如何申请及使用QQ?源码
2.从Linux源码看Socket(TCP)的listen及连接队列
3.python socketserveråsocketçåºå«
4.SC.exe使用完全指南
在台湾如何申请及使用QQ?
利用跳板
跳板使用方法: 启动[跳板客户端]和sockscap
在sockscap里的文件--socks设置--socks服务器为:.0.0.1 :
socks5版本
把IE,QQ的图标拖进sockscap里面
然后在sksockserverGUI里设置(服务运行端口要与sockscap一致)
客户端设置:IP .0.0.1 掩码 ...
经过的SkServerGUI:填上你得到的(台湾的)跳板地址和端口,[E允许]的源码选项划上勾,按[增加]即可 (增加够再测试一下,通过测试才能使用)
顺便说一句:此是sockscap里的IE已可以访问所有被禁网站!
QQ申请具体方法:
1.启动[跳板客户端]和sockscap
2.跳板客户端SkServerGUI 添上台湾的socks5代理地址和端口 (加密的socks5就叫跳板)
3.在SkServerGUI中测试跳板,看是否能通过测试
4.通过后,启动在sockscap中的QQ-------QQ申请导向------按正常的申请方法申请即可
在台湾能使用QQ,但要下大陆的源码QQ版本
从Linux源码看Socket(TCP)的listen及连接队列
了解Linux内核中Socket (TCP)的"listen"及连接队列机制是深入理解网络编程的关键。本文将基于Linux 3.内核版本,源码从源码角度解析Server端Socket在进行"listen"时的源码具体实现。
建立Server端Socket需要经历socket、源码开源直播源码bind、源码listen、源码accept四个步骤。源码本文聚焦于"listen"步骤,源码深入探讨其内部机理。源码
通过socket系统调用,源码我们可以创建一个基于TCP的源码Socket。这里直接展示了与TCP Socket相关联的源码操作函数。
接着,源码我们深入到"listen"系统调用。注意,glibc的INLINE_SYSCALL对返回值进行了封装,仅保留0和-1两种结果,并将错误码的绝对值记录在errno中。其中,backlog参数至关重要,设置不当会引入隐蔽的陷阱。对于Java开发者而言,框架默认backlog值较小(默认),这可能导致微妙的行为差异。
进入内核源码栈,妖股异动主图指标公式源码我们发现内核对backlog值进行了调整,限制其不超过内核参数设置的somaxconn值。
核心调用程序为inet_listen。其中,除了fastopen外的逻辑(fastopen将在单独章节深入讨论)最终调用inet_csk_listen_start,将sock链入全局的listen hash表,实现对SYN包的高效处理。
值得注意的是,SO_REUSEPORT特性允许不同Socket监听同一端口,实现内核级的负载均衡。Nginx 1.9.1版本启用此功能后,性能提升3倍。
半连接队列与全连接队列是连接处理中的关键组件。通常提及的sync_queue与accept_queue并非全貌,sync_queue实际上是syn_table,而全连接队列为icsk_accept_queue。在三次握手过程中,这两个队列分别承担着不同角色。
在连接处理中,除了qlen与sk_ack_backlog计数器外,qlen_young计数器用于特定场景下的统计。SYN_ACK的重传定时器在内核中以ms为间隔运行,确保连接建立过程的稳定。
半连接队列的存在是为抵御半连接攻击,避免消耗大量内存资源。通过syn_cookie机制,h5修仙挂机手游源码内核能有效防御此类攻击。
全连接队列的最大长度受到限制,超过somaxconn值的连接会被内核丢弃。若未启用tcp_abort_on_overflow特性,客户端可能在调用时才会察觉到连接被丢弃。启用此特性或增大backlog值是应对这一问题的策略。
backlog参数对半连接队列容量产生影响,导致内核发送cookie校验时出现常见的内存溢出警告。
总结而言,TCP协议在数十年的演进中变得复杂,深入阅读源码成为分析问题的重要途径。本文深入解析了Linux内核中Socket (TCP)的"listen"及连接队列机制,旨在帮助开发者更深入地理解网络编程。
python socketserveråsocketçåºå«
åºå«ï¼1.é¦å ä»ç»ä¸socket
socketçè±æåä¹æ¯âåâæâæ座âãä½ä¸ºBSD UNIXçè¿ç¨éä¿¡æºå¶ï¼ååä¸ç§ææãé常ä¹
称ä½"å¥æ¥å"ï¼ç¨äºæè¿°IPå°åå端å£ï¼æ¯ä¸ä¸ªéä¿¡é¾çå¥æï¼å¯ä»¥ç¨æ¥å®ç°ä¸åèææºæä¸å计ç®æºä¹é´çéä¿¡ãå¨Internetä¸ç主æºä¸ è¬è¿è¡äºå¤ä¸ªæå¡è½¯ä»¶ï¼åæ¶æä¾å ç§æå¡ãæ¯ç§æå¡é½æå¼ä¸ä¸ªSocketï¼å¹¶ç»å®å°ä¸ä¸ªç«¯å£ä¸ï¼ä¸åç端å£å¯¹åºäºä¸åçæå¡ãSocketæ£å¦å ¶è±æå æé£æ ·ï¼åä¸ä¸ªå¤åæ座ãä¸å°ä¸»æºç¹å¦å¸æ»¡åç§æ座çæ¿é´ï¼æ¯ä¸ªæ座æä¸ä¸ªç¼å·ï¼æçæ座æä¾ä¼äº¤æµçµï¼ æçæä¾ä¼äº¤æµçµï¼æçåæä¾æ线çµè§èç®ã 客æ·è½¯ä»¶å°æ头æå°ä¸åç¼å·çæ座ï¼å°±å¯ä»¥å¾å°ä¸åçæå¡
2ãè¿æ¥åç
æ ¹æ®è¿æ¥å¯å¨çæ¹å¼ä»¥åæ¬å°å¥æ¥åè¦è¿æ¥çç®æ ï¼å¥æ¥åä¹é´çè¿æ¥è¿ç¨å¯ä»¥å为ä¸ä¸ªæ¥éª¤ï¼æå¡å¨çå¬ï¼å®¢æ·ç«¯è¯·æ±ï¼è¿æ¥ç¡®è®¤ã
ï¼1ï¼æå¡å¨çå¬ï¼æ¯æå¡å¨ç«¯å¥æ¥å并ä¸å®ä½å ·ä½ç客æ·ç«¯å¥æ¥åï¼èæ¯å¤äºçå¾ è¿æ¥çç¶æï¼å®æ¶çæ§ç½ç»ç¶æã
ï¼2ï¼å®¢æ·ç«¯è¯·æ±ï¼æ¯æç±å®¢æ·ç«¯çå¥æ¥åæåºè¿æ¥è¯·æ±ï¼è¦è¿æ¥çç®æ æ¯æå¡å¨ç«¯çå¥æ¥åã为æ¤ï¼å®¢æ·ç«¯çå¥æ¥åå¿ é¡»é¦å æè¿°å®è¦è¿æ¥çæå¡å¨çå¥æ¥åï¼æåºæå¡å¨ç«¯å¥æ¥åçå°åå端å£å·ï¼ç¶åå°±åæå¡å¨ç«¯å¥æ¥åæåºè¿æ¥è¯·æ±ã
ï¼3ï¼è¿æ¥ç¡®è®¤ï¼æ¯æå½æå¡å¨ç«¯å¥æ¥åçå¬å°æè 说æ¥æ¶å°å®¢æ·ç«¯å¥æ¥åçè¿æ¥è¯·æ±ï¼å®å°±ååºå®¢æ·ç«¯å¥æ¥åç请æ±ï¼å»ºç«ä¸ä¸ªæ°ç线ç¨ï¼ææå¡å¨ç«¯å¥æ¥ åçæè¿°åç»å®¢æ·ç«¯ï¼ä¸æ¦å®¢æ·ç«¯ç¡®è®¤äºæ¤æè¿°ï¼è¿æ¥å°±å»ºç«å¥½äºãèæå¡å¨ç«¯å¥æ¥å继ç»å¤äºçå¬ç¶æï¼ç»§ç»æ¥æ¶å ¶ä»å®¢æ·ç«¯å¥æ¥åçè¿æ¥è¯·æ±ã
æ¡ä¾
1ãæç®åçwebæå¡å¨
2ãç®åçèå¤©å·¥å ·
ï¼1ï¼service端
ï¼2ï¼client端
3ãæ´å¤åè½
æ´å¤åè½
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
åæ°ä¸ï¼å°åç°
socket.AF_INET IPv4ï¼é»è®¤ï¼
socket.AF_INET6 IPv6
socket.AF_UNIX åªè½å¤ç¨äºåä¸çUnixç³»ç»è¿ç¨é´éä¿¡
åæ°äºï¼ç±»å
socket.SOCK_STREAMããæµå¼socket , for TCP ï¼é»è®¤ï¼
socket.SOCK_DGRAMãã æ°æ®æ¥å¼socket , for UDP
socket.SOCK_RAW åå§å¥æ¥åï¼æ®éçå¥æ¥åæ æ³å¤çICMPãIGMPçç½ç»æ¥æï¼è
SOCK_RAWå¯ä»¥ï¼å ¶æ¬¡ï¼SOCK_RAWä¹å¯ä»¥å¤çç¹æ®çIPv4æ¥æï¼æ¤å¤ï¼å©ç¨åå§å¥æ¥åï¼å¯ä»¥
éè¿IP_HDRINCLå¥æ¥åé项ç±ç¨æ·æé IP头ã
socket.SOCK_RDM æ¯ä¸ç§å¯é çUDPå½¢å¼ï¼å³ä¿è¯äº¤ä»æ°æ®æ¥ä½ä¸ä¿è¯é¡ºåºã
SOCK_RAMç¨æ¥æä¾å¯¹åå§åè®®çä½çº§è®¿é®ï¼å¨éè¦æ§è¡æäºç¹æ®æä½æ¶ä½¿ç¨ï¼
å¦åéICMPæ¥æãSOCK_RAMéå¸¸ä» éäºé«çº§ç¨æ·æ管çåè¿è¡çç¨åºä½¿ç¨ã
socket.SOCK_SEQPACKET å¯é çè¿ç»æ°æ®å æå¡
åæ°ä¸ï¼åè®®
0ããï¼é»è®¤ï¼ä¸ç¹å®çå°å家æç¸å ³çåè®®,å¦ææ¯ 0 ï¼
åç³»ç»å°±ä¼æ ¹æ®å°åæ ¼å¼åå¥æ¥ç±»å«,èªå¨éæ©ä¸ä¸ªåéçåè®®
sk.bind(address)
s.bind(address) å°å¥æ¥åç»å®å°å°åãaddresså°åçæ ¼å¼åå³äºå°åæã
å¨AF_INETä¸ï¼ä»¥å ç»ï¼host,portï¼çå½¢å¼è¡¨ç¤ºå°åã
sk.listen(backlog)
å¼å§çå¬ä¼ å ¥è¿æ¥ãbacklogæå®å¨æç»è¿æ¥ä¹åï¼å¯ä»¥æèµ·çæ大è¿æ¥æ°éã
backlogçäº5ï¼è¡¨ç¤ºå æ ¸å·²ç»æ¥å°äºè¿æ¥è¯·æ±ï¼ä½æå¡å¨è¿æ²¡æè°ç¨acceptè¿è¡å¤çç
è¿æ¥ä¸ªæ°æ大为5,è¿ä¸ªå¼ä¸è½æ é大ï¼å 为è¦å¨å æ ¸ä¸ç»´æ¤è¿æ¥éå
sk.setblocking(bool)
æ¯å¦é»å¡ï¼é»è®¤Trueï¼ï¼å¦æ设置Falseï¼é£ä¹acceptårecvæ¶ä¸æ¦æ æ°æ®ï¼åæ¥éã
sk.accept()
æ¥åè¿æ¥å¹¶è¿åï¼conn,addressï¼,å ¶ä¸connæ¯æ°çå¥æ¥å对象ï¼å¯ä»¥ç¨æ¥æ¥æ¶
ååéæ°æ®ãaddressæ¯è¿æ¥å®¢æ·ç«¯çå°åãæ¥æ¶TCP 客æ·çè¿æ¥ï¼é»å¡å¼ï¼çå¾ è¿æ¥çå°æ¥
sk.connect(address)
è¿æ¥å°addresså¤çå¥æ¥åãä¸è¬ï¼addressçæ ¼å¼ä¸ºå ç»ï¼hostname,portï¼,
å¦æè¿æ¥åºéï¼è¿åsocket.erroré误ã
sk.connect_ex(address)
åä¸ï¼åªä¸è¿ä¼æè¿åå¼ï¼è¿æ¥æåæ¶è¿å 0 ï¼è¿æ¥å¤±è´¥æ¶åè¿åç¼ç ï¼ä¾å¦ï¼
sk.close()
å ³éå¥æ¥å
sk.recv(bufsize[,flag])
æ¥åå¥æ¥åçæ°æ®ãæ°æ®ä»¥å符串形å¼è¿åï¼bufsizeæå®æå¤å¯ä»¥æ¥æ¶çæ°éã
flagæä¾æå ³æ¶æ¯çå ¶ä»ä¿¡æ¯ï¼é常å¯ä»¥å¿½ç¥ã
sk.recvfrom(bufsize[.flag])
ä¸recv()类似ï¼ä½è¿åå¼æ¯ï¼data,addressï¼ãå ¶ä¸dataæ¯å å«æ¥æ¶æ°æ®çå符串ï¼
addressæ¯åéæ°æ®çå¥æ¥åå°åã
sk.send(string[,flag])
å°stringä¸çæ°æ®åéå°è¿æ¥çå¥æ¥åãè¿åå¼æ¯è¦åéçåèæ°éï¼
该æ°éå¯è½å°äºstringçåè大å°ãå³ï¼å¯è½æªå°æå®å å®¹å ¨é¨åéã
sk.sendall(string[,flag])
å°stringä¸çæ°æ®åéå°è¿æ¥çå¥æ¥åï¼ä½å¨è¿åä¹åä¼å°è¯åéæææ°æ®ã
æåè¿åNoneï¼å¤±è´¥åæåºå¼å¸¸ã
å é¨éè¿éå½è°ç¨sendï¼å°ææå 容åéåºå»ã
sk.sendto(string[,flag],address)
å°æ°æ®åéå°å¥æ¥åï¼addressæ¯å½¢å¼ä¸ºï¼ipaddrï¼portï¼çå ç»ï¼æå®è¿ç¨å°åã
è¿åå¼æ¯åéçåèæ°ã该å½æ°ä¸»è¦ç¨äºUDPåè®®ã
sk.settimeout(timeout)
设置å¥æ¥åæä½çè¶ æ¶æï¼timeoutæ¯ä¸ä¸ªæµ®ç¹æ°ï¼åä½æ¯ç§ãå¼ä¸ºNone表示没æè¶ æ¶æã
ä¸è¬ï¼è¶ æ¶æåºè¯¥å¨åå建å¥æ¥åæ¶è®¾ç½®ï¼å 为å®ä»¬å¯è½ç¨äºè¿æ¥çæä½
ï¼å¦ client è¿æ¥æå¤çå¾ 5s ï¼
sk.getpeername()
è¿åè¿æ¥å¥æ¥åçè¿ç¨å°åãè¿åå¼é常æ¯å ç»ï¼ipaddr,portï¼ã
sk.getsockname()
è¿åå¥æ¥åèªå·±çå°åãé常æ¯ä¸ä¸ªå ç»(ipaddr,port)
sk.fileno()
å¥æ¥åçæ件æ述符
äºãsocket server
SocketServerå é¨ä½¿ç¨ IOå¤è·¯å¤ç¨ 以å âå¤çº¿ç¨â å âå¤è¿ç¨â ï¼ä»èå®ç°å¹¶åå¤çå¤ä¸ªå®¢æ·ç«¯è¯·æ±çSocketæå¡ç«¯ãå³ï¼æ¯ä¸ªå®¢æ·ç«¯è¯·æ±è¿æ¥å°æå¡å¨æ¶ï¼Socketæå¡ç«¯é½ä¼å¨æå¡å¨æ¯å建ä¸ä¸ªâ线ç¨âæè âè¿ ç¨â ä¸é¨è´è´£å¤çå½å客æ·ç«¯çææ请æ±ã
注ï¼å¯¼å ¥æ¨¡åçæ¶å 3.xçæ¬æ¯socketserver 2.xçæ¬æ¯SocketServer
1.ThreadingTCPServer
ThreadingTCPServerå®ç°çSoketæå¡å¨å é¨ä¼ä¸ºæ¯ä¸ªclientå建ä¸ä¸ª â线ç¨âï¼è¯¥çº¿ç¨ç¨æ¥å客æ·ç«¯è¿è¡äº¤äºã
ThreadingTCPServeråºç¡
使ç¨ThreadingTCPServer:
å建ä¸ä¸ªç»§æ¿èª SocketServer.BaseRequestHandler çç±»
ç±»ä¸å¿ é¡»å®ä¹ä¸ä¸ªå称为 handle çæ¹æ³
å¯å¨ThreadingTCPServer
æå¡ç«¯
客æ·ç«¯
å é¨è°ç¨æµç¨ä¸ºï¼
å¯å¨æå¡ç«¯ç¨åº
æ§è¡ TCPServer.init æ¹æ³ï¼å建æå¡ç«¯Socket对象并ç»å® IP å 端å£
æ§è¡ BaseServer.init æ¹æ³ï¼å°èªå®ä¹ç继æ¿èªSocketServer.BaseRequestHandler çç±» - MyRequestHandleèµå¼ç» self.RequestHandlerClass
æ§è¡ BaseServer.server_forever æ¹æ³ï¼While 循ç¯ä¸ç´çå¬æ¯å¦æ客æ·ç«¯è¯·æ±å°è¾¾ ...
å½å®¢æ·ç«¯è¿æ¥å°è¾¾æå¡å¨
æ§è¡ ThreadingMixIn.process_request æ¹æ³ï¼å建ä¸ä¸ª â线ç¨â ç¨æ¥å¤ç请æ±
æ§è¡ ThreadingMixIn.process_request_thread æ¹æ³
æ§è¡ BaseServer.finish_request æ¹æ³ï¼æ§è¡ self.RequestHandlerClass() å³ï¼æ§è¡ èªå®ä¹ MyRequestHandler çæé æ¹æ³ï¼èªå¨è°ç¨åºç±»BaseRequestHandlerçæé æ¹æ³ï¼å¨è¯¥æé æ¹æ³ä¸åä¼è°ç¨ MyRequestHandlerçhandleæ¹æ³ï¼
ForkingTCPServer
ForkingTCPServeråThreadingTCPServerç使ç¨åæ§è¡æµç¨åºæ¬ä¸è´ï¼åªä¸è¿å¨å é¨åå«ä¸ºè¯·æ±è å»ºç« â线ç¨â å âè¿ç¨âã
SC.exe使用完全指南
写这个东西的目的在于让大家了解一下SC这个服务管理程序的使用,另一方面也是为了让大家更进一步的了解到NT,的服务的一些基础问题,如果有时间,希望大家好好看看。再来结合起上一次如何打开termservice服务的那篇文章,在服务方面大家应该比较了解了。用这个东西就可以删除在别人机器里留下的如ffsniffer, sksockerver这些东西,不用再担心,装上了删除不了。但是毕竟这个东西还是MS的产品,所以,如eventlog这样的奶粉源码没积分是什么意思服务,是不可以用它关闭的。累呀累呀,写了我整整一个早上,就是不知道有没有人看!sc.exe下载地址:mand Servicename [Optionname= Optionvalue]
2. SC [command]
这里使用第一种语法使用SC,使用第二种语法显示帮助。
下面介绍各种参数。
Servername
可选择:可以使用双斜线,如//myserver,也可以是//..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/system/NewServ.exe
按照默认,这个服务会建立一个WIN_SHARE_PROCESS使用SERVICE_DEMAND_START启动方式。这将不会有任何从属关系,也将会按照localsystem安全上下关系来运行。
例2
下面这个例子将在本地计算机上,建立一个服务,它将会是一个自动运行服务,并且运行在他自己的进程上。它从属于TDI组和NetBios服务上。注意,你必须在从属中间增加一个空格的引用。
sc create NewService binpath= c:/winnt/system/NewServ.exe type= own
start= auto depend= "+TDI Netbios"
例3
服务开发者可以通过临时改变二进制路径(影像路径)的方式来将这个服务运行在内核调试器的上下关系中。下面这个例子就可以让我们看到如何改变服务的配置。
sc config NewService binpath= "ntsd -d c:/winnt/system/Newserv.exe"
这个例子会引起服务控制管理器调用ntsd.exe使用下例的参数字符串:
"-d c:/nt/system/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 : WIN_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:/winnt/system/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)
列举缓冲区的尺寸,默认是 bytes
ri=----(numeric value)
但开始列举时,恢复指针的数字,默认是0
Optionvalue
同上。
Comments
SC QUERY命令可以显示SERVICE_STATUS结构的内容。
下面是SERVICE_STATUS结构相应的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN_EXIT_CODE----dwWinExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint
在启动计算机后,使用SC QUERY命令会告诉你是否,或者不是一个启动服务的尝试。如果这个服务成功启动,WIN_EXIT_CODE区间会将会包含一个0,当尝试不成功时,当它意识到这个服务不能够启动时,这个区间也会提供一个退出码给服务。
例子
查询“NewService"服务状态,键入:
sc query NewService
显示一下信息:
SERVICE_NAME: NewService
TYPE : WIN_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN_EXIT_CODE : (0x)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
注意,这里存在一个给这个服务的退出码,即使这个服务部不在运行,键入net helpmsg ,将会得到对错误信息的说明:
上次启动之后,仍未尝试引导服务。
所以,这里我想说一句,希望大家可以活用net helpmsg,这会对你的学习有很大的帮助。
下面在对SC query的命令在说明一下:
列举活动服务和驱动程序状态,使用以下命令:
sc query
显示messenger服务,使用以下命令:
sc query messenger
只列举活动的驱动程序,使用以下命令:
sc query type= driver
列举Win服务,使用以下命令:
sc query type= service
列举所有的服务和驱动程序,使用以下命令:
sc query state= all
用 byte的缓冲区来进行列举,使用以下命令:
sc query bufsize=
在恢复列举时使用index=,使用以下命令:
sc query ri=
列举所有的交互式服务,使用以下命令:
sc query type= service type= interact