xp与win7间通过命名管道通信遇到的问题 求教

saodilaoseng 2011-08-02 10:39:52
最近在看命名管道,遇到了一个问题,描述如下:
命名管道服务器如果在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;
}
...全文
224 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
saodilaoseng 2011-08-04
  • 打赏
  • 举报
回复
我又用win7与win7间进行通信,结果还是不行,感觉win7对权限这块控制的比较严
luciferisnotsatan 2011-08-02
  • 打赏
  • 举报
回复
微软发布win7时明确说明,win7不做xp兼容性考虑。vista当初就是考虑和xp兼容,结果做砸了

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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