Я буду использовать библиотеку API C POSIX, чтобы узнать о программировании сокетов. Я буду создавать серверы, которые будут прослушивать подключения и клиенты, которые будут подключаться к серверу. На сервере есть текстовый файл, который выглядит так:
Peter,Male,10
Mary,Female,20
Tim,Male,30
Shrek,Male,40
Сервер будет читать в текстовом файле и хранить его в структуре данных. Мне интересно, если будет никаких проблем с совместимостью с использованием C++ СТЛ как vector
вместе с API C POSIX хранить всю информацию текстового файла?
Может ли кто-нибудь мне посоветовать, следует ли использовать C- struct
или C++ STL?
Вы можете вызывать функции 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.
То, что вам в основном нужно, - это способ сериализации структуры/класса данных определенным образом, чтобы вы могли легко передать его по линии передачи.
Это не относится к случаю API-интерфейсов C vs C++, на которые вы ссылаетесь, но также необходимо для правильной передачи данных между, например, двумя машинами с различной степенью точности.
Уже существует ряд решений для сериализации структур, некоторые из которых проще в использовании, чем другие. В настоящее время я в основном работаю над системой, в которой мы используем Thrift, которая позволяет вам определять типы данных и структуры в легко читаемом файле IDL и затем создавать файлы, реализующие их для большого количества языков, чтобы вы могли экземпляр очень легко переносит класс из программы C++ по сети в класс в программе Java.
Другие возможности включают JSON, XML и, возможно, большое количество других. Поскольку ваше дело выглядит относительно простым, вы, конечно, можете просто написать свой собственный - например, включив функции serialize()
и unserialize()
, которые соответственно преобразуют все переменные-члены вашего класса в массив char
(сериализация) и устанавливают все переменные-члены вашего класса из массива char
(unserialization).
POSIX - это C-API, который часто использует указатели на блоки памяти, которые должны быть переданы или получены. Это работает в C++, пока вы ограничиваете свои данные POD -types. Как только вы передадите структуру с чем-то вроде строки std ::, у вас будет неопределенное поведение. Это означает, что вы не можете отправлять или получать что-то вроде
struct Person
{
std::string name;
}
по сети, не преобразовывая его в POD перед отправкой, а затем конвертируя его обратно.
C++ имеет свои собственные библиотеки, гораздо более подходящие для выполнения сетевых задач (Boost.Asio?), Поэтому эти вопросы могут служить только образовательным целям.
Конечно, возможно использовать C API из C++.
К сожалению, для этого требуются некоторые знания об утилизации имен, контейнерах C++ и используемом API. Когда вы задали этот вопрос, у вас могут возникнуть трудности с поиском как C++, так и POSIX API.
Вы можете использовать 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 */