1. 程式人生 > >TCP/IP 中多種不同資料型別的傳輸--使用結構體

TCP/IP 中多種不同資料型別的傳輸--使用結構體

這兩天在弄TCP/IP通訊,原本直接用位元組一個一個自己組裝並且轉換格式,麻煩不說更容易出錯。因此看到有人介紹這種方法,我試了一下發現確實很好;因此記錄下來,方便下次查閱!!!
假設需要傳送的結構體如下:

typedef struct Data {
    int list[10];//資料
    long long currentTime;//當前時間戳
}Data;

思想

TCP是無邊界的位元組流傳輸,所以需要將結構體轉換為字串後在傳送,在傳送資料的地方對資料進行處理,將其轉換成一個字串/結構體進行傳送,而在接受方定義相同的結構體對這個字串或者結構體進行解析即可。

傳送方

程式碼如下:

int list[10] = { 300,300,330,300,330,300,330,300,330,300 };
char buffer[BUFFER_SIZE];//傳送的字串
struct Data data;//宣告一個需要傳送的結構體
for (int i = 0; i < 10; i++) {
                data.list[i] = list[i];
            }
 data.currentTime = GetTickCount();
cout << "當前時間 :" << data.currentTime << endl;
memcpy
(buffer, &data, sizeof(Data)); //把這個結構體中的資訊從記憶體中讀入到字串buffer中 return_info = send(s_Host, buffer, sizeof(Data), 0);

接收方

程式碼如下:

//同樣需要定義字串和相同的結構體物件 
char buffer[100]; //傳送的字串 
struct Data data;//宣告一個存放接收資訊的結構體 
memset(buffer, 0, sizeof(buffer)); //清記憶體
memset(&data, 0, sizeof(data));
//下面是接收字串的程式碼   
//第一個引數指客戶端(另一端,繫結的是客戶端的IP地址和埠)套接字描述符;第二個引數指明一個緩衝區,
//該緩衝區用來存放recv函式接收到的資料;第三個引數指明buf的長度;第四個引數一般置0。 err_code = recv(sClient, buffer, sizeof(buffer), 0); //下面對字串資訊進行還原,將其變成我們的結構體資料 memcpy(&data, buffer, sizeof(data)); //data傳送到了這邊的data //輸出顯示收到的資料是否正確 for (int i = 0; i < 10; i++) { cout << data.list[i] << " "; } cout << endl; cout << data.currentTime << endl;