2014-01-22 5 views
0

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

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

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

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

+0

Вы должны использовать оболочку RAII сокета, а затем использовать STL, где это необходимо ... – Mgetz

+1

Я уже делал это с помощью нескольких проектов, он отлично работает, и я еще не сталкивался с проблемами. – CoffeeandCode

+1

Когда вы думаете об этом, C++ будет практически бесполезен на миллионах компьютеров, если он несовместим с Posix. – Duck

ответ

0

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

Возможно использовать C API на C++.

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

+0

Зачем ему нужно знать, как его компиляторы называют mangling? Я сомневаюсь, что он имеет в виду, что он будет загружать функции динамически, когда он говорит о программировании сокетов. – CoffeeandCode

+0

Я имею в виду требования декларации extern. – Basilevs

+0

О, ну в этом случае все posix libs имеют '# ifdef' с 'extern 'C" для C++ (по крайней мере, любая современная реализация делает) – CoffeeandCode

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 */ 
1

Вы можете вызывать функции 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

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

struct Person 
{ 
    std::string name; 
} 

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

0

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

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

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

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

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