用CreateNamePipe创建管道以后,ConnectNamedPipe出错。这是为什么?

JeanLove 2010-09-01 07:06:08

#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;
}


运行结果是Connect error:536
查了一下MSDN,这样解释的:
ERROR_PIPE_LISTENING
536 (0x218) Waiting for a process to open the other end of the pipe.

1.我的代码里面有什么错误吗?
2.那个SECURITY_ATTRIBUTES结构体,能否指定为NULL,有没有什么影响?

谢谢!!!!!
...全文
1034 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
raymonzhao 2010-09-02
  • 打赏
  • 举报
回复
还是不行,我用了你的CreateNamedPipe里面的参数以后,发现在ConnectNamedPipe那里阻塞了,根本过不去了。
如何才能让ConnectNamedPipe成功呢?
--------------
你再开另一个线程或进程呢。我这里打算自己跟自己来通讯吗?
JeanLove 2010-09-02
  • 打赏
  • 举报
回复
还是不行,我用了你的CreateNamedPipe里面的参数以后,发现在ConnectNamedPipe那里阻塞了,根本过不去了。
如何才能让ConnectNamedPipe成功呢?

[Quote=引用 2 楼 cj1205 的回复:]

C/C++ code

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 ……
[/Quote]
SEESEECN 2010-09-02
  • 打赏
  • 举报
回复
楼上正解。
PIPE_WAIT:在这个模式下,ConnectNamedPipe函数在连接上客户端之前是不会返回的。
PIPE_NOWAIT:在这个模式下,ConnectNamedPipe函数会立即返回,如果你么有可以连接的客户端,当然会出错了。你如果先把客户端打开 应该也不会出错了。

一般建议用PIPE_WAIT模式
cj1205 2010-09-01
  • 打赏
  • 举报
回复

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;
}



这是一段比较流行的代码

你在CreateNamePipe的时候使用了选项:PIPE_NOWAIT,非阻塞的方式,你改为阻塞的方式看看

呵呵,助你好运
sichuanwww 2010-09-01
  • 打赏
  • 举报
回复
等待高人出现。帮你顶。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧