簡體   English   中英

如何在 C 中的 TCP 上發送整數數組?

[英]How do I send an array of integers over TCP in C?

我相信write()只能發送字節的數據緩沖區(即有符號字符),那么如何使用 sys/socket.h 庫中的 C write() function 發送長整數數組?

顯然,我不能只將 long 轉換為 char,因為任何超過 127 的數字都會出現格式錯誤。

我看了一下這個問題, 如何將 integer 數組分解為字節數組(像素編碼) ,但無法理解 - 如果這是我要找的,請有人把它弄小一點嗎?

跟進問題:

為什么從 TCP 套接字讀取整數數組時會得到奇怪的結果?

write 的原型是:

ssize_t write(int fd, const void *buf, size_t count);

因此,雖然它以字節為單位寫入,但它可以采用任何類型的指針。 傳遞一個int*完全沒有問題。

編輯:

但是,我建議您還發送您計划首先發送的整數數量,以便接收者知道要讀取多少。 像這樣的東西(為簡潔起見省略了錯誤檢查):

int x[10] = { ... };
int count = 10;
write(sock, &count, sizeof(count));
write(sock, x, sizeof(x));

注意:如果數組來自動態 memory (就像你malloc編輯它),你不能使用sizeof 在這種情況下,計數將等於: sizeof(int) * element_count

編輯:

正如Brian Mitchell所指出的,您可能還需要注意字節序問題。 發送任何多字節值時就是這種情況(如我推薦的計數以及數組的每個元素)。 這是通過htons / htonlntohs / ntohl函數完成的。

Write 可以做你想做的事,但是有一些事情需要注意:

1:您可能會收到不在 int 邊界上的部分寫入,因此您必須准備好處理這種情況

2:如果代碼需要可移植,您應該將您的數組轉換為特定的字節序,或者對消息中的字節序進行編碼。

是的,您可以將指向緩沖區的指針轉換為指向char的指針,然后調用write() 將指針轉換為 C 中的不同類型不會影響指向的 memory 的內容——它所做的只是表明程序員的意圖,即該地址的 ZCD69B4957F06CD818D7BF3D61980E2 的內容以不同的方式解釋。

只需確保為write()提供數組的正確大小(以字節為單位) - 在您的情況下,這將是元素數乘以sizeof (long)

發送單個 int(假設 4 字節 int)的最簡單方法是:

int tmp = htonl(myInt);
write(socket, &tmp, 4);

其中 htonl 是將 int 轉換為網絡字節順序的 function 。 (同樣,當您從套接字讀取時,function ntohl可用於轉換回主機字節順序。)

對於整數數組,您首先希望將數組成員的計數作為整數發送(按網絡字節順序),然后發送整數值。

聲明一個字符數組。 在數組的每個位置,存儲 integer 數字,而不是字符。 然后你就發送那個。

例如:

char tcp[100];

tcp[0] = 0;
tcp[1] = 0xA;
tcp[2] = 0xB;
tcp[3] = 0xC;
.
.

// Send the character array
write(sock, tcp, sizeof(tcp));

在您的客戶端/服務器程序中具有序列化/反序列化功能會更好。

每當你想發送數據時,將數據序列化到一個字節緩沖區中,然后通過 TCP 發送它並帶有字節數。

接收數據時,將緩沖區中的數據反序列化為您自己的解釋。

您可以根據需要以任何形式解釋字節緩沖區。 它可以包含基本數據類型、對象等。

只要確保照顧好字節序以及 alignment 的東西。

我認為您需要在這里提出一個協議

假設您的 integer 數組是:

100, 99, 98, 97

我不會將整數直接寫入緩沖區,而是通過將數組轉換為字符串表示來“序列化”數組。 字符串可能是:

"100,99,98,97"

這就是將通過電線發送的內容。 在接收端,您將用逗號分割字符串並備份數組。

這更加標准化,人類可讀,並且意味着人們不必考慮高/低字節順序和其他愚蠢的事情。

// 諷刺

如果您在 .NET 或 Java 中工作,您可能會將其編碼為 XML,如下所示:

<ArrayOfInt><Int>100</Int><Int>99</Int><Int>98</Int><Int>97</Int></ArrayOfInt>

:)

暫無
暫無

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

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