【发布时间】:2016-12-29 12:49:06
【问题描述】:
我正在尝试通过命名管道在两台 Windows 电脑之间发送消息。
在本地调用 CreateNamedPipe 时,一切正常。如果我将主机名从"\\\\.\\pipe\\testpipename" 更改为"\\\\myHostname\\pipe\\testpipename",我会从getLastError() 得到一个ERROR_INVALID_NAME(123)。
这是我的代码:
BOOL fConnected = FALSE;
DWORD dwThreadId = 0;
HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL;
LPTSTR pipeName = /*nullptr*/ TEXT("\\\\myHostname\\pipe\\testpipename");
SECURITY_ATTRIBUTES sa = { 0 };
SECURITY_DESCRIPTOR sd = { 0 };
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
sa.bInheritHandle = false;
sa.lpSecurityDescriptor = &sd;
sa.nLength = sizeof(sa);
hPipe = CreateNamedPipe(
pipeName, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
255, // output buffer size
255, // input buffer size
0, // client time-out
&sa); // default security attribute
if (hPipe == INVALID_HANDLE_VALUE)
{
cout << GetLastError();
return -2;
}
cout << "Waiting for client to connect!" << endl;
//waiting for client to connect
fConnected = ConnectNamedPipe(hPipe, NULL) ?
TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
cout << "Client connected! YEAH" << endl;
我的猜测是管道名无效,但我不知道为什么。有什么想法吗?
【问题讨论】:
-
您是否尝试过使用 IP 地址而不是主机名?
-
@user3549596 是的,出现同样的错误。
-
可能听起来很傻,但管道名称是否正确,服务器上是否允许端口 445 入站?
-
@user3549596 出于测试目的,两台电脑上的防火墙都已完全关闭。你的意思是 pipename 是完整的字符串还是只有主机名部分?
-
嗯,为什么不两个?这也是一些非常延伸的方法:尝试使用相同的用户名和密码设置客户端和服务器(不要忘记密码!)。然后运行这些东西。
标签: c++ ipc named-pipes