烦了菜鸟3天的问题,命名管道,客户端能等到管道实例,就是不能打开管道。

雷格 2012-06-05 04:49:48
命名管道,客户端和服务端都在一台电脑上时是可以的。

但是我把服务端放到自己电脑上(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找不到网络路径
...全文
422 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wZi 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

命名管道没听说过可以跨机器访问,都是同机上使用。
[/Quote]

+1.

socket也不用管协议啊。

他都帮我们实现了。。

PS:刚查了下,还真可以把命名管道弄成网络通信。

同等大牛!
localxiao 2012-06-06
  • 打赏
  • 举报
回复
那你就把guest用户打开
然后把权限降下来,否则是不让访问的,否则,很容易远程管道1326错误
win2k的好处是,权限控制没这样严格,方便你通过代码
雷格 2012-06-06
  • 打赏
  • 举报
回复
终于有人回答了 好感动,我去试试。。
宿舍都是win7的机子 。2000的没有啊 !虚拟机又不会设置
[Quote=引用 14 楼 的回复:]

补充下,隐约记得在同一个域内,权限就够了

所以最好设置下域,如果你想方便测试的话,可以搞一台2000的机器试试
[/Quote]
localxiao 2012-06-06
  • 打赏
  • 举报
回复
补充下,隐约记得在同一个域内,权限就够了

所以最好设置下域,如果你想方便测试的话,可以搞一台2000的机器试试
localxiao 2012-06-06
  • 打赏
  • 举报
回复
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用户或者是其他的专用用户打开



Kaile 2012-06-05
  • 打赏
  • 举报
回复
命名管道没听说过可以跨机器访问,都是同机上使用。
EzioChen 2012-06-05
  • 打赏
  • 举报
回复
坐等大神出手.....
雷格 2012-06-05
  • 打赏
  • 举报
回复
我把防火墙 和杀毒软件都关了 还是一样
[Quote=引用 7 楼 的回复:]

防火墙关没
[/Quote]
prohibit 2012-06-05
  • 打赏
  • 举报
回复
防火墙关没
雷格 2012-06-05
  • 打赏
  • 举报
回复

//客户端
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#include "resource.h"

#pragma comment(lib,"shlwapi.lib")
HANDLE hPipe=NULL;

BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int iCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
}

BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hand;//主窗口的句柄;
static HWND hEdit1,hEdit2;
static BOOL bConnect = FALSE;
TCHAR tips[1024];
TCHAR words2[1024]=TEXT("CLT:\r\n");
TCHAR words[1024];
DWORD bytewrite;

int iStart,iEnd;

switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_SEND:
GetDlgItemText(hand,IDC_EDIT2,words,1024);
StrCat(words2,words);
StrCat(words2,TEXT("\r\n"));
SendMessage (hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)words2); //向显示框中添加新输入的文本;
if(bConnect)
{
if (0==WriteFile(hPipe,words2,lstrlen(words2)+2,&bytewrite,NULL))
{
wsprintf(tips,TEXT("写入管道数据失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
words[0]=TEXT('\0');
SetDlgItemText(hand,IDC_EDIT2,words);//清空编辑框;
return FALSE;
}
}

words[0]=TEXT('\0');
SetDlgItemText(hand,IDC_EDIT2,words);//清空编辑框;
wsprintf(tips,TEXT("写入管道数据成功"));
SetDlgItemText(hand,IDC_TIP,tips);
return TRUE;

case IDC_RECEIVE:
if (!ReadFile(hPipe,words,1024,&bytewrite,NULL))
{
wsprintf(tips,TEXT("读取管道数据失败!错误代码:(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
return FALSE;
}
SendMessage (hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)words); //向显示框中添加新输入的文本;
return TRUE;

case IDC_CONNECT:
if (!WaitForSingleObject(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),NMPWAIT_WAIT_FOREVER))
{
wsprintf(tips,TEXT("当前没有可以用的管道实例!"));
SetDlgItemText(hand,IDC_TIP,tips);
return FALSE;
}
wsprintf(tips,TEXT("等到了可以用的管道实例!"));
SetDlgItemText(hand,IDC_TIP,tips);

hPipe = CreateFile(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),GENERIC_READ|GENERIC_WRITE,0,
NULL,OPEN_EXISTING,0,NULL);
if (INVALID_HANDLE_VALUE==hPipe)
{
wsprintf(tips,TEXT("打开命名管道失败!错误代码:(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
hPipe = NULL;
return FALSE;
}
wsprintf(tips,TEXT("命名管道打开成功!"));
SetDlgItemText(hand,IDC_TIP,tips);

bConnect = TRUE;
return TRUE;

default:
return FALSE;
}

case WM_INITDIALOG:
hand = hwnd;
hEdit1 = GetDlgItem(hwnd,IDC_EDIT1);
hEdit2 = GetDlgItem(hwnd,IDC_EDIT2);

return TRUE;

case WM_CLOSE:
if (hPipe)
{
//CloseHandle(hPipe);
}
EndDialog(hwnd, 0);
return FALSE;

default:
return FALSE;
}
}

雷格 2012-06-05
  • 打赏
  • 举报
回复
我抱着希望上代码吧

//服务端
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#include <process.h>
#include "resource.h"

#pragma comment(lib,"shlwapi.lib")

typedef struct
{
HWND hand;
HWND hEdit1;
}Data;

HANDLE hPipe=NULL;

BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int iCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
}

VOID ReceiveThread(PVOID pvoid)
{
TCHAR tips[50];
TCHAR words[1024];
DWORD byteread,iStart,iEnd;
Data*pDdata= (Data*)pvoid;

while (TRUE)
{
if (!ReadFile(hPipe,words,1024,&byteread,NULL))
{
wsprintf(tips,TEXT("读取管道数据失败!错误代码:(%d)"),GetLastError());
SetDlgItemText(pDdata->hand,IDC_TIP,tips);
//MessageBox(NULL,tips,TEXT("m"),MB_OK);
return;
}
SendMessage (pDdata->hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (pDdata->hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (pDdata->hEdit1, EM_REPLACESEL, 0, (LPARAM)words); //向显示框中添加新输入的文本;
}
/* wsprintf(tips,TEXT("error!错误代码(%d)"),GetLastError());
MessageBox(NULL,tips,TEXT("MESSGAE!"),MB_OK);
*/
}

BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hand;//主窗口的句柄;
static HWND hEdit1,hEdit2;
HANDLE hEvent;
OVERLAPPED ovlap;
static BOOL bConnect = FALSE;
TCHAR tips[1024];
TCHAR words2[1024]=TEXT("SRV:\r\n");
static TCHAR words[1024];
DWORD bytewrite;
static Data data;

int iStart,iEnd;

switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_SEND:
GetDlgItemText(hand,IDC_EDIT2,words,1024);
StrCat(words2,words);
StrCat(words2,TEXT("\r\n"));
SendMessage (hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)words2); //向显示框中添加新输入的文本;
if(bConnect)
{
if (!WriteFile(hPipe,words2,lstrlen(words2)+2,&bytewrite,NULL))
{
wsprintf(tips,TEXT("写入管道数据失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
}
}

words[0]=TEXT('\0');
SetDlgItemText(hand,IDC_EDIT2,words);//清空编辑框;
SetDlgItemText(hand,IDC_TIP,TEXT("写入管道数据成功!"));
return TRUE;

case IDC_CONNECT:
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
if (!hEvent)
{
wsprintf(tips,TEXT("创建事件对象失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
CloseHandle(hPipe);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("创建事件对象成功!正在连接..."));

ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent = hEvent;

if (!ConnectNamedPipe(hPipe,&ovlap))
{
if (ERROR_IO_PENDING!=GetLastError())
{
wsprintf(tips,TEXT("等待客户连接失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("连接成功!正在等待对象"));
}
SetDlgItemText(hand,IDC_TIP,TEXT("连接成功!正在等待对象"));

if (WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))
{
wsprintf(tips,TEXT("等待对象失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("等待对象成功!"));
bConnect = TRUE;
CloseHandle(hEvent);

data.hand = hand;
data.hEdit1 = hEdit1;
_beginthread(ReceiveThread,0,(PVOID)&data);
return TRUE;
}
return TRUE;

case WM_INITDIALOG:
hand = hwnd;
hEdit1 = GetDlgItem(hwnd,IDC_EDIT1);
hEdit2 = GetDlgItem(hwnd,IDC_EDIT2);

hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"),PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);
if (INVALID_HANDLE_VALUE==hPipe)
{
wsprintf(tips,TEXT("创建命名管道失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("创建命名管道成功,未连接!"));
bConnect =TRUE;

return TRUE;

case WM_CLOSE:
if (hPipe)
{
CloseHandle(hPipe);
}
EndDialog(hwnd, 0);
return FALSE;

default:
return FALSE;
}
}

雷格 2012-06-05
  • 打赏
  • 举报
回复
命名管道啊 不是说用命名管道比socket简单吗 因为不需要了解 网络协议
[Quote=引用 3 楼 的回复:]

管道不是进程间通信用的吗?怎么网络也在用?
[/Quote]
NorZ 2012-06-05
  • 打赏
  • 举报
回复
管道不是进程间通信用的吗?怎么网络也在用?
qixing1115 2012-06-05
  • 打赏
  • 举报
回复
SOCKET吧,网络管道还真没用过
W170532934 2012-06-05
  • 打赏
  • 举报
回复
好奇诡了,没有遇到过。坐等大牛了。顶起!!!

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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