2014-01-16 2 views
2

В течение нескольких дней я пытаюсь запустить тестовую программу для отправки данных из 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); 
} 
+0

«pwrite.exe перестает работать» означает сбой. Запустите его под отладчиком (при необходимости используйте удаленный отладчик или windbg) и посмотрите, что произойдет. –

ответ

1

Я вижу кое-что здесь не так.

Вы открываете трубу с помощью FILE_FLAG_OVERLAPPED. Вам необходимо указать структуру OVERLAPPED как последний параметр для WriteFile, но вы прошли NULL.

См. Документацию WriteFile. Теперь из-за этого вы вполне можете получить код ошибки при вашей второй попытке написать ERROR_IO_PENDING.

Мое предложение перестроить код сервера, так что вы либо правильно работать с перекрытой парадигмы, или превратить от флаг перекрытия (то есть ваш параметр lbNumberofBytesWritten должны быть не NULL).

+0

@ пользователь3203993, без проблем! Нажмите маленькую отметку, чтобы принять ответ, и, надеюсь, это поможет любому будущему посетителю с аналогичной проблемой :) –

+0

Спасибо Moo-Juice за ваш ответ. Теперь программа работает, я отключил флаг перекрытия и установил lbNumberofBytesWritten в не-NULL, используя DWORD dwBytes = 1024; и установка lbNumberofBytesWritten = & dwBytes; Еще раз спасибо за вашу помощь, я ценю это! – user3203993

Смежные вопросы