Передача типа данных структуры в именованные каналы в C ++ - PullRequest
0 голосов
/ 04 июля 2018

Я нашел одну примерную программу, которая передает строку от клиента к серверу в именованных каналах. Как я могу передать тип данных структуры через именованные каналы в C ++?

Функция WriteFile клиента выглядит следующим образом:

WriteFile(hPipe,TEXT("Hello Pipe\n"),12,&dwWritten,NULL);

Функция ReadFile сервера выглядит следующим образом:

while (ReadFile(hPipe, buffer, sizeof(buffer)-1, &dwRead, NULL))

Структура, которую мне нужно передать, выглядит следующим образом:

struct EventLogEntry 
   {
       string date;
       string time;
       string subsystem;
       unsigned long eventType;
       string majorFunction;
       string messageText;
       unsigned long timeStamp; //Added for TimeZone Corrections
   };

В CreateNamedPipe() Я использую PIPE_TYPE_BYTE PIPE_READMODE_BYTE режим трубы. Нужно ли менять их на PIPE_TYPE_BYTE и PIPE_READMODE_MESSAGE?

1 Ответ

0 голосов
/ 04 июля 2018

Вы не можете передавать экземпляры класса по проводам.

У вас есть два варианта.

A) Использовать буферы фиксированного размера:

struct mydata {
  char message[200];
  char name[50];
  int time;
};

и просто отправьте sizeof(mydata) через трубу.

B) Маршал данных в другом формате:

struct mywiredata {
  int messageoffset;
  int nameoffset;
  int time;
  char buffer[ANYSIZE_ARRAY]; //blogs.msdn.microsoft.com/oldnewthing/20040826-00/?p=38043
};

Здесь у вас в основном есть фиксированная часть заголовка со всеми строками, хранящимися как байты в конце. Вы находите начало строки, обращаясь к буферу с соответствующим смещением. Вам нужен код сортировки на каждом конце канала для преобразования в / из ваших структур EventLogEntry и mywiredata.

...