15,471
社区成员
发帖
与我相关
我的任务
分享
#include<windows.h>
#include<winbase.h>
#include<stdio.h>
#pragma comment(lib, "Advapi32.lib")
#define BUFSIZE 1024
SECURITY_ATTRIBUTES sa;
char buf[BUFSIZE]="hw";
int main(void){
DWORD dwWrite,ret;
sa.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)malloc(SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(sa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
// ACL is set as NULL in order to allow all access to the object.
SetSecurityDescriptorDacl(sa.lpSecurityDescriptor, TRUE, NULL, FALSE);
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
HANDLE hpipe=CreateNamedPipe("\\\\.\\pipe\\mypipe",PIPE_ACCESS_DUPLEX|WRITE_DAC,
PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_NOWAIT,1,BUFSIZE,BUFSIZE,2000,&sa);
if(!hpipe){
printf("named pipe error\n");
exit(1);}
BOOL bConnected = ConnectNamedPipe(hpipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
if(!bConnected){
printf("Connect error %d\n",GetLastError());
exit(1);}
return 0;
}
m_hPipe = CreateNamedPipe("\\\\.\\Pipe\\Test", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道
if (m_hPipe == INVALID_HANDLE_VALUE) m_sMessage = "创建命名管道失败!";
else
{
m_sMessage = "成功创建命名管道!";
AfxBeginThread(ReadProc, this); // 开启线程
}
UINT ReadProc(LPVOID lpVoid)
{
char buffer[1024]; // 数据缓存
DWORD ReadNum;
CServerView* pView = (CServerView*)lpVoid; // 获取视句柄
if (ConnectNamedPipe(pView->m_hPipe, NULL) == FALSE) // 等待客户机的连接
{
CloseHandle(pView->m_hPipe); // 关闭管道句柄
pView->m_sMessage = "与客户机建立连接失败!"; // 显示信息
pView->Invalidate();
return 0;
}else{
pView->m_sMessage = "与客户机建立连接!"; // 显示信息
pView->Invalidate();
}
// 从管道读取数据
if (ReadFile(pView->m_hPipe, buffer, sizeof(buffer), &ReadNum, NULL) == FALSE)
{
CloseHandle(pView->m_hPipe); // 关闭管道句柄
pView->m_sMessage = "从管道读取数据失败!"; // 显示信息
pView->Invalidate();
} else {
buffer[ReadNum] = '\0'; // 显示接收到的信息
pView->m_sMessage = CString(buffer);
pView->Invalidate();
}
return 1;
}