Совместим ли API C POSIX с C ++ STL

0

Я буду использовать библиотеку API C POSIX, чтобы узнать о программировании сокетов. Я буду создавать серверы, которые будут прослушивать подключения и клиенты, которые будут подключаться к серверу. На сервере есть текстовый файл, который выглядит так:

Peter,Male,10
Mary,Female,20
Tim,Male,30
Shrek,Male,40

Сервер будет читать в текстовом файле и хранить его в структуре данных. Мне интересно, если будет никаких проблем с совместимостью с использованием C++ СТЛ как vector вместе с API C POSIX хранить всю информацию текстового файла?

Может ли кто-нибудь мне посоветовать, следует ли использовать C- struct или C++ STL?

  • 0
    Вы должны использовать оболочку RAII сокета ... и затем использовать STL, где это необходимо ...
  • 1
    Я сделал это уже с парой проектов, все работает отлично, и я не столкнулся ни с какими проблемами.
Показать ещё 1 комментарий
Теги:
struct
stl
compatibility

5 ответов

1

Вы можете вызывать функции C из C++ программ. Для этого вам нужно объявить их как "extern C", чтобы компилятор знал, как их называть. Но хорошей новостью является то, что в вашей библиотеке C есть файлы, почти наверняка есть что-то в этом роде:

#ifdef __cplusplus
extern "C" {
#endif

/* C callable stuff goes here */

#ifdef __cplusplus
}
#endif

так что, если вы включите их из программы C++, функции уже объявлены как C-функции.

Аргументы, которые вы передаете функциям C, должны иметь тип, который указывает их объявление, поэтому вам нужно будет использовать структуры, указатели и т.д. По мере необходимости. Однако внутренне ваша программа может использовать любые STL или другие библиотеки C++, которые вы хотите.

Для C++ имеются сетевые библиотеки, которые упростят использование сокетов из C++. Они по сути являются обертками вокруг функционалов POSIX (или эквивалент для других платформ). Однако, если вы пытаетесь изучить POSIX API или хотите сделать что-то, не поддерживаемое этими библиотеками, вы можете напрямую вызвать POSIX API.

0

То, что вам в основном нужно, - это способ сериализации структуры/класса данных определенным образом, чтобы вы могли легко передать его по линии передачи.

Это не относится к случаю API-интерфейсов C vs C++, на которые вы ссылаетесь, но также необходимо для правильной передачи данных между, например, двумя машинами с различной степенью точности.

Уже существует ряд решений для сериализации структур, некоторые из которых проще в использовании, чем другие. В настоящее время я в основном работаю над системой, в которой мы используем Thrift, которая позволяет вам определять типы данных и структуры в легко читаемом файле IDL и затем создавать файлы, реализующие их для большого количества языков, чтобы вы могли экземпляр очень легко переносит класс из программы C++ по сети в класс в программе Java.

Другие возможности включают JSON, XML и, возможно, большое количество других. Поскольку ваше дело выглядит относительно простым, вы, конечно, можете просто написать свой собственный - например, включив функции serialize() и unserialize(), которые соответственно преобразуют все переменные-члены вашего класса в массив char (сериализация) и устанавливают все переменные-члены вашего класса из массива char (unserialization).

0

POSIX - это C-API, который часто использует указатели на блоки памяти, которые должны быть переданы или получены. Это работает в C++, пока вы ограничиваете свои данные POD -types. Как только вы передадите структуру с чем-то вроде строки std ::, у вас будет неопределенное поведение. Это означает, что вы не можете отправлять или получать что-то вроде

struct Person
{
    std::string name;
}

по сети, не преобразовывая его в POD перед отправкой, а затем конвертируя его обратно.

0

C++ имеет свои собственные библиотеки, гораздо более подходящие для выполнения сетевых задач (Boost.Asio?), Поэтому эти вопросы могут служить только образовательным целям.

Конечно, возможно использовать C API из C++.

К сожалению, для этого требуются некоторые знания об утилизации имен, контейнерах C++ и используемом API. Когда вы задали этот вопрос, у вас могут возникнуть трудности с поиском как C++, так и POSIX API.

  • 0
    Зачем ему нужно знать, что его компиляторы называют искажения? Я сомневаюсь, что он имеет в виду, что он будет загружать функции динамически, когда он говорит о программировании сокетов.
  • 0
    Я имею в виду требования внешней декларации.
Показать ещё 1 комментарий
0

Вы можете использовать std::vector struct или class для хранения данных. Чтение и запись из/в файл с использованием C POSIX API не должно быть проблемой вообще.

struct Record
{
   enum Gender {MALE, FEMALE};

   std::string name;
   Gender gender;
   int age;
}

std::vector<Record> records;

/* Read the data from the file using C POSIX API and store them in records */

/* Use the data from records and save them in file using C POSIX API */

Ещё вопросы

Сообщество Overcoder
Наверх
Меню