2014-01-22 50 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

當你想到它時,如果它與Posix不兼容,C++在數百萬臺計算機上幾乎沒有用處。 – Duck

回答

0

C++有更適合做網絡任務的自己的庫(Boost.Asio?),所以這個問題只能用於教育目的。

肯定可以使用C++的C API。

不幸的是,這樣做需要一些關於名稱修改,C++容器和正在使用的API的知識。當你問這個問題時,你可能在學習C++和POSIX API時遇到困難。

+0

爲什麼他需要知道他的編譯器名稱是否被破壞?我懷疑他意味着當他談論套接字編程時,他會動態地加載函數。 – CoffeeandCode

+0

我的意思是外部申報要求。 – Basilevs

+0

噢,在那種情況下,所有的posix庫都有'#ifdef'和'extern' C++'(用於C++)(至少任何現代實現都是這樣) – CoffeeandCode

0

您可以使用std::vectorstructclass來存儲數據。使用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 functoins(或其他平臺的等價物)的包裝。但是,如果您正在嘗試學習POSIX API或想要執行某些不受這些庫支持的功能,則可以直接調用POSIX API。

0

POSIX是一個C-API,它經常使用指向要傳輸或接收的內存塊的指針。只要您將數據限制爲POD -types,就可以在C++中使用。只要你用std :: string這樣的東西來傳遞一個結構體,你將會有未定義的行爲。這意味着你不能沒有發送,然後將其轉換回之前將其轉換爲POD發送或接收類似

struct Person 
{ 
    std::string name; 
} 

在網絡上。

0

您基本上需要的是一種以定義的方式序列化數據結構/類的方法,以便您可以通過傳輸線輕鬆傳輸它。

這不是特指您所指的C vs C++ API的情況,而是正確傳輸具有不同endianness的兩臺計算機之間的數據所必需的。

已經存在一些序列化結構的解決方案,比其他的更容易使用。目前,我主要在使用​​的系統上工作,該系統允許您在易於閱讀的IDL文件中定義數據類型和結構,然後可以生成實現大量語言的文件,以便您可以實例非常容易通過網絡將C++程序中的類轉換爲Java程序中的類。

其他的可能性包括JSON,XML和其他可能的大量其他可能性。由於您的案例看起來相對簡單,您當然也可以自己編寫 - 例如包含serialize()unserialize()函數,它們分別將類的所有成員變量轉換爲數組char(序列化),並將所有成員變量設置爲您的類從char(反序列化)的數組。