2014-03-24 74 views
2

我已經在C中定義了以下結構,並且我想使用Berkeley套接字上的Linux客戶端和服務器之間的TCP連接發送:通過TCP連接傳送與Berkeley套接字可變結構尺寸

struct Argument{ 
int pid; 
int length; 
chat op; 
char *data; 
}; 

因爲我有一個「char * data」,它是一個指針,可以用於在本地發送機器中分配可變大小的數據,所以我必須在兩個不同的時間將此結構發送到接收端。 第一次,我只發送固定變量,即前三個變量。然後在接收時,我分配一個長度大小的緩衝區來第二次接收數據部分。

所以我的問題是有反正只有一次發送這個結構到另一側的可變數據字段大小,而不是兩次,因爲我在做什麼?

if (write(peer_fd, (struct Argument*) arg, sizeof (struct Argument)) < 0) 
{ 
    close(peer_fd); 
    return -1; 
} 

非常感謝。

+0

如果在分配結構時知道'data'的大小,則可以使用0長度數組。 – imreal

+0

@Nick爲什麼要使用黑客,如果你有完全合法的解決方案? – this

+0

只是拋出那裏,OP似乎想要一個塊。除此之外,它們在我住的地方是完全合法的:) – imreal

回答

1

考慮使用分散收集讀寫技術。

readv writev

的wtitev允許用戶從在單個呼叫的多個緩衝器(固定大小的標頭和字符數組)寫。您將承擔單個系統調用的成本,並且內核中的套接字代碼將數據組合爲單個緩衝區(如果可能),並進行單個網絡調用。

+0

我試過你的方式,但在接收端的問題,readv命令不會返回iov的長度。你需要手動設置它,所以我回到原來的問題。 – IoT

+0

對。但是你的問題在一定程度上得到解決。在寫入方面,只有一個系統調用和一個網絡寫入(而不是每個寫入2個)。在閱讀方面,你可以做兩件事之一。可以讀入一個緩衝區,該緩衝區的大小可達數組大小的上限 - 這將導致一次讀取。或者讓一個讀取標題,第二個讀取數組 - 這是兩個系統調用,但是一個網絡調用。任何一個都是對原件的改進。 – Ziffusion

+0

關於閱讀部分,您可以詳細闡述一下嗎?你能舉兩個例子嗎?謝謝。 – IoT