簡體   English   中英

在套接字上發送C char數組

[英]Sending a C char array over a socket

我想在unix中的tcp套接字上發送一個字符數組。

我的第一個想法是使用普通的char數組作為將通過套接字發送的結構:

typedef struct __attribute__((packed))
{
   uint8_t type;
   uint8_t id_index;
   char char_value[STR_MSG_MAX];
} a_msg;

僅僅因為C char總是8位長。 然而,在一些谷歌搜索后,我發現即使一個字符串總是8位長,底層表示實際上可能是一個32位整數。 所以我的印象是char可能不是在消息中表示字符串的最佳方式,該消息將通過套接字從FreeBSd發送到Linux(或者如果你想要輸入其他一些unix)...)。

stdint.h出現在所有現代的unix上(我希望),我的想法是,也許uint8_t或int8_t的數組可以做到這一點。

typedef struct __attribute__((packed))
{
   uint8_t type;
   uint8_t id_index;
   uint8_t char_value[STR_MSG_MAX];
} a_msg;

要么

typedef struct __attribute__((packed))
{
   uint8_t type;
   uint8_t id_index;
   int8_t char_value[STR_MSG_MAX];
} a_msg;

但是,uint8_t是unsigned char,int8_t是signed char。 標准C char既不是那個,因為我理解它的實現是未定義的。

我的問題是:在C中表示字符數組(字符串)的最佳方法是什么,它將通過tix / ip以* nix(Linux,FreeBSD等)獨立於平台的方式發送。

雖然char可能超過8位寬,但它必須始終是(相等)最窄的類型。 (由於除其他原因之外, sizeof(char)被定義為1)。

因此,如果平台提供int8_t ,那么char必須正好是8位(因為char被單獨限制為至少8位)。 這意味着你不妨使用char

我個人會這樣做:

typedef struct __attribute__((packed))
{
   uint8_t type;
   uint8_t id_index;
   uint8_t padding[2]; //this is to align to 32bit boundary
   uint8_t char_value[STR_MSG_MAX];
} a_msg;

但它可以在沒有填充的情況下工作。

在C中, char總是8位長。 所以char數組總是一個字節數組。 但是字符文字'x'是32位。 這可以使用字符文字上的sizeof運算符進行驗證。 您還將看到返回單個字符(如getch所有函數都返回一個int 原因是我們需要一種指示文件結束EOF的方法。 這只能使用8位范圍之外的值來完成。

你不能說你發送的是什么c。 此信息不會傳輸。

你所要做的就是:

char* buffer = (char*)(&a_msg);

最安全的方法是使用無符號字符。

我認為打包結構的想法是要走的路。 我會寫一些測試代碼以確保它正常工作。 做一個sizeof(a_msg)來查看它的大小。 您應該能夠判斷包裝是否有效而無需通過套接字發送消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM