几天以来,我一直试图让测试程序运行,通过Named Pipes将数据从64位应用程序发送到32位应用程序。在我的Windows 8.1笔记本电脑(64位)上,下面代码中的测试程序运行得非常好。当我尝试在Windows 7(64位)台式计算机上运行完全相同的代码时,服务器端会弹出“pwrite.exe已停止工作”。当我编译它并在桌面上运行它或者我在台式计算机上运行可执行文件(在笔记本电脑上编译)时(只需复制两个.exe文件)就会发生这种情况。
奇怪的是客户端在第一个WriteFile操作中接收通过命名管道发送的值,但它不会从for循环中的第二个操作获取值。因此,在客户端收到正确的值并将其显示在控制台窗口中之后,服务器端就会卡住。可能由于某种原因,我没有写入权限,系统在一次操作后意识到这一点,但我希望与权限相关的错误,实际情况并非如此。
为了给你一个更好的主意:
笔记本电脑和台式计算机帐户均以管理员身份运行。我尝试将安全级别设置为控制面板中的最低级别。
我在桌面计算机上禁用了Windows防火墙
'netstat -a'在端口445,135和137'LISTENING'下给出,我知道这些是命名管道常用的端口。
我正在使用Visual Studio 2012
客户端和服务器端独立运行,不会出现此问题
桌面运行速度为3.4GHz,笔记本电脑运行速度为1.8 GHz
桌面有.NET framework 4.0,笔记本电脑有4.5
我认为解决方案必须在安全设置中找到,或者在同步问题上找到,所以这是我搜索天数的方向,但没有成功。
服务器:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <string>
#include "globals.h"
using namespace std;
#define THE_PIPE "\\\\.\\pipe\\testpipe"
int main()
{
HANDLE pipe = CreateFile(THE_PIPE, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
double i = 0;
boolean r = true;
while (r == true) {
std::ostringstream ostr;
ostr << i+0.000010;
std::string theNumberString = ostr.str();
string message = theNumberString;
WriteFile(pipe, message.c_str(), message.length() + 1, NULL, NULL);
cout << GetLastError() << endl;
i++;
if (pipe == INVALID_HANDLE_VALUE)
{
cout << "Error: " << GetLastError();
}
}
return 0;
}
客户端:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
#define THE_PIPE "\\\\.\\pipe\\testpipe"
int main()
{
boolean t = true;
char key = '\0';
HANDLE pipe = CreateNamedPipe(THE_PIPE, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_WAIT, 1, 1024, 1024, 120 * 1000, NULL); //FILE_SHARE_READ
while (1) {
if (_kbhit()) key = _getch();
if (key == 'q') break;
if (pipe == INVALID_HANDLE_VALUE)
{
cout << "Error: " << GetLastError();
}
char data[1024];
DWORD numRead;
ConnectNamedPipe(pipe, NULL);
ReadFile(pipe, data, 1024, &numRead, NULL);
if (numRead > 0){
cout << data << endl;
}
}
CloseHandle(pipe);
}
答案 0 :(得分:1)
我可以在这里看到一些错误。
用FILE_FLAG_OVERLAPPED
打开管道。您需要提供OVERLAPPED
结构作为WriteFile
的最后一个参数,但您已通过NULL
。
请参阅WriteFile
文档。因此,您可能会在第二次尝试编写ERROR_IO_PENDING
时收到错误代码。
我的建议是重构您的服务器代码,以便您正确使用重叠的范例,或者将关闭重叠标记(意味着您的lbNumberofBytesWritten
参数必须是非空)。