2014-01-22 1 views
0

소켓 프로그래밍에 대해 배우려면 C POSIX API 라이브러리를 사용합니다. 나는 연결을 기다릴 서버와 서버에 연결할 클라이언트를 만들 것입니다. 서버에는 다음과 같은 텍스트 파일이 있습니다.C POSIX API가 C++ STL과 호환 가능

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

서버는 텍스트 파일을 읽고 데이터 구조에 저장합니다. vector 같은 C++ STL을 C POSIX API와 함께 사용하여 모든 텍스트 파일 정보를 저장하는 데 호환성 문제가 있을지 궁금합니다.

C struct 또는 C++ STL을 사용해야하는 사람이 있습니까?

+0

당신은 소켓의 RAII 래퍼를 사용해야하고 적절한 곳에서 STL을 사용해야합니다 ... – Mgetz

+1

몇 가지 프로젝트를 통해 이미이 작업을 해봤지만 정상적으로 작동하고 아직 문제가 발생하지 않았습니다. – CoffeeandCode

+1

Posix와 호환되지 않는다면 C++은 수백만 대의 컴퓨터에서 거의 쓸모가 없을 것입니다. – Duck

답변

0

C++에는 네트워킹 작업 (Boost.Asio?)에 훨씬 적합한 자체 라이브러리가 있으므로이 질문은 교육 목적으로 만 사용할 수 있습니다.

C++의 C API를 사용할 수 있습니다.

불행히도 이렇게하려면 이름 맹 글링, C++ 컨테이너 및 사용중인 API에 대한 지식이 필요합니다. 이 질문을 할 때 C++ 및 POSIX API를 배우려는 어려움이있을 수 있습니다.

+0

왜 그는 컴파일러 이름의 mangling을 알아야할까요? 나는 그가 소켓 프로그래밍에 대해 이야기 할 때 동적으로 함수를 로딩한다는 것을 의심스럽게 생각한다. – CoffeeandCode

+0

나는 extern 선언 요구 사항을 의미합니다. – Basilevs

+0

아, 그럴 경우, 모든 posix 라이브러리는'# ifdef's와'extern "C"'for ++를 ​​가지고 있습니다 (적어도 현대적인 구현은 그렇지 않습니다) – CoffeeandCode

0

std::vectorstruct 또는 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 함수를 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 :: string과 같은 구조체를 전송하자 마자 정의되지 않은 동작이 발생합니다. 즉, 보내고 나서 다시 변환하기 전에 POD로 변환하지 않고

과 같은 것을 보내거나받을 수 없다는 것을 의미합니다.

0

기본적으로 데이터 구조/클래스를 정의 된 방식으로 직렬화하여 전송 라인을 통해 쉽게 전송할 수있는 방법이 필요합니다.

이것은 당신이 말하는 C vs C++ API의 경우와 다르지 않지만, endianness이 서로 다른 두 대의 컴퓨터 사이에서 데이터를 올바르게 전송하는 데 필요합니다.

구조를 직렬화하는 여러 가지 솔루션이 이미 존재합니다. 일부는 다른 것보다 사용하기가 더 쉽습니다. 현재는 주로 Thrift을 사용하는 시스템에서 작업하며, 읽기 쉬운 IDL 파일로 데이터 유형과 구조를 정의한 다음 많은 언어에 대해이를 구현하는 파일을 생성 할 수 있습니다. 인스턴스는 네트워크를 통해 C++ 프로그램에서 Java 프로그램의 클래스로 클래스를 매우 쉽게 전송합니다.

다른 가능성으로는 JSON, XML 및 기타 여러 가지가 있습니다. 귀하의 케이스가 상대적으로 단순 해 보이기 때문에, 물론 serialize()unserialize() 함수를 포함하여 클래스의 모든 멤버 변수를 char (직렬화) 배열로 각각 변환하고 모든 멤버 변수를 다음과 같이 설정하여 직접 작성할 수도 있습니다. char 배열에서 클래스를 (unserialization).