В течение нескольких дней я пытаюсь запустить тестовую программу для отправки данных из 64-разрядного приложения в 32-разрядное приложение через Named Трубы. На моем ноутбуке Windows 8.1 (64 бит) тестовая программа в коде ниже работает отлично. Когда я пытаюсь запустить тот же самый код на настольном компьютере под управлением Windows 7 (64-разрядный), на стороне сервера появляется всплывающее окно «pwrite.exe перестает работать». Это происходит, когда я либо компилирую его, либо запускаю на рабочем столе, либо когда запускаю исполняемые файлы (скомпилированные на ноутбуке) на настольном компьютере (просто копируя два файла .exe).Программы с именованными трубами работают на одном компьютере, сервер перестает работать на другом компьютере
Странная вещь, что клиентская сторона получает значение, посылаемое по именованному каналу в первой операции WriteFile, но не получит значение от второй операции в цикле for. Поэтому после того, как клиентская сторона получит правильное значение и отобразит его в окне консоли, серверная сторона застрянет. Возможно, по какой-то причине у меня нет разрешения на запись, и система понимает это после одной операции, но я ожидаю ошибку, связанную с разрешением, что не так.
Чтобы дать вам лучшее представление:
ноутбуки и настольные компьютеры счета работает в качестве администратора. Я попытался установить уровень безопасности на самый низкий уровень в панели управления.
Я отключил брандмауэр Windows на рабочем столе компьютера
«NetStat -a» в окне командной строки на обоих компьютерах дают под порт 445, 135 и 137 «ПРОСлУШИВАНИЕ», которые я понял, это порты часто используется для именных труб.
Я использую Visual Studio 2012
Либо клиент и на стороне сервера запустить самостоятельно, без этой проблемы, происходящих
Desktop работает на 3.4GHz, ноутбук работает на частоте 1,8 ГГц
Desktop имеет .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);
}
«pwrite.exe перестает работать» означает сбой. Запустите его под отладчиком (при необходимости используйте удаленный отладчик или windbg) и посмотрите, что произойдет. –