烦了菜鸟3天的问题,命名管道,客户端能等到管道实例,就是不能打开管道。
命名管道,客户端和服务端都在一台电脑上时是可以的。
但是我把服务端放到自己电脑上(win7)
客户端放在室友电脑(win7)上就不行了。
客户端可以等到管道实例,就是不能用CreateFile打开管道,错误代码为53:找不到网络路径。
既然WaitForSingleObject(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),NMPWAIT_WAIT_FOREVER)可以成功,那网络路径怎么会是错的。那为什么CreateFile(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),GENERIC_READ|GENERIC_WRITE,0,
NULL,OPEN_EXISTING,0,NULL);会失败呢?
服务端创建管道的代码为:
CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"),PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);
创建时可以成功的。
ConnectNamedPipe(hPipe,&ovlap)连接也成功了。
就是到了WaitForSingleObject(hEvent,INFINITE)一直阻塞 因为客户端不能用CreateFile打开管道。
为什么会这样了,服务端调用ConnectNamedPipe(hPipe,&ovlap)都成功了
客户端调用WaitForSingleObject(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),NMPWAIT_WAIT_FOREVER)也成功了,
客户端为什么不能用CreteFile打开管道呢?而是错误代码53找不到网络路径
[解决办法]
防火墙关没
[解决办法]
if (!WaitForSingleObject(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),NMPWAIT_WAIT_FOREVER))
{
wsprintf(tips,TEXT("当前没有可以用的管道实例!"));
SetDlgItemText(hand,IDC_TIP,tips);
return FALSE;
}
这段代码是在干嘛
注意WaitForSingleObject的返回值不是BOOL,WAIT_OBJECT_0的值是0,也就是说,如果成功等待一个对象,那么值是0!的条件刚好写反了!
另外WaitForSingleObject换成WaitNamedPipe,这2个函数不是等价的啊,虽然内部实现差不多
然后是,打开远程管道需要权限,CreateNamedPide的安全描述符你要设置下,然后是你可能需要新建一个用户,开启guest用户或者是其他的专用用户打开
[解决办法]
补充下,隐约记得在同一个域内,权限就够了
所以最好设置下域,如果你想方便测试的话,可以搞一台2000的机器试试
[解决办法]
那你就把guest用户打开
然后把权限降下来,否则是不让访问的,否则,很容易远程管道1326错误
win2k的好处是,权限控制没这样严格,方便你通过代码