xp与win7间通过命名管道通信遇到的问题 求教
最近在看命名管道,遇到了一个问题,描述如下:
命名管道服务器如果在xp上运行,管道客户端在win7上进行连接,可以正常通信,反过来,
命名管道服务器在win7上运行,客户端在xp上连接,无法连接,WaitNamedPipe返回错误
1385,msdn上对该错误的描述是:
ERROR_LOGON_TYPE_NOT_GRANTED
1385
Logon failure: the user has not been granted the requested logon type at this computer
好像是权限问题,不允许登陆,把防火墙关掉也没用。感觉应该是win7上对外来的连接有什么
限制,关键代码如下:
服务器(采用完成端口实现)
bool CSession::InitPipe(void)
{
for (unsigned int i = 0; i < MaxInstanceNum; i++)
{
HANDLE hPipe = NULL;
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
if (InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION) == 0)
{
ErrRecord("InitializeSecurityDescriptor Error");
return FALSE;
}
if (SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE)== 0)
{
ErrRecord("SetSecurityDescriptorDacl Error");
return FALSE;
}
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = TRUE;
hPipe = CreateNamedPipe(
PipeName, // pipe name
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances PIPE_UNLIMITED_INSTANCES
OutBuffSize, // output buffer size
InBuffSize, // input buffer size
INFINITE, // client time-out
&sa); // 此处填充NULL效果也一样
if (hPipe == INVALID_HANDLE_VALUE)
{
ErrRecord("...CreateNamedPipeW Error");
return FALSE;
}
if(!g_ComPortHandle->BindDevWithCompletionPort(hPipe,i)) //句柄与完成端口绑定
{
return FALSE;
}
memset(&g_PipeMsg[i].PipeOp,0,sizeof(PRE_IO_DATA));
g_PipeMsg[i].PipeOp.nHandle = hPipe;
g_PipeMsg[i].PipeOp.nType = OP_CONNECT;
g_PipeMsg[i].Index = i;
g_PipeMsg[i].Free = TRUE;
memset(g_PipeMsg[i].PipeOp.Buffer,'\0',sizeof(g_PipeMsg[i].PipeOp.Buffer));
InitializeCriticalSection(&g_PipeMsg[i].cs);
ConnectNamedPipe (g_PipeMsg[i].PipeOp.nHandle, &(g_PipeMsg[i].PipeOp.ol));
}
return TRUE;
}
客户端:
int ConnectServer(void)
{
while (1)
{
if (WaitNamedPipe(PIPEPATH, 2000) == FALSE)
{
printf("Client Wait fail ,Code = %d\n",GetLastError());
Sleep(1000);
}else
{
break;
}
}
hPipe = CreateFile(PIPEPATH, GENERIC_READ |GENERIC_WRITE , 0, NULL, OPEN_EXISTING,0, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
printf("CreateFile Error ,Code = %d\n",GetLastError() );
}
return 0;
}