2011-05-28 50 views
1

我的客戶端將使用名爲annoucement的結構/類與客戶端進行通信。我想我會用C++編寫服務器。將會有許多不同的類繼承annoucement。我的問題是通過網絡發送這些類到客戶端在C/C++服務器,C/C++和C#客戶端之間通過網絡發送數據結構

我想也許我應該使用iovec。但是我不知道在C#中是否有與iovec相對應的東西。

的理念是: 我會派一個結構與writev則客戶端將使用readv從套接字讀取的數據,如這將是一個annoucement類,檢查UINT16變量在接收結構推斷的確切類型和用apprioprite iovec/readv讀取其餘數據。

C#可以將整個對象作爲數組發送,但是如何在C/C++中解釋它?

我希望C/C++和C#客戶端能夠使用相同的協議,但這是我第一次設計協議,我不確定我的所有想法是否可以一起工作。

任何暗示讚賞。

回答

4

不要試圖用結構來定義協議。

定義通告的格式,即按什麼順序構成通告的字節,然後定義如何按順序傳輸多個通告。

一旦你定義了這個連線格式,你可以用每種編程語言實現解析器和編寫器,使用每個編程語言中最合適的編程語言結構,庫和框架。

一個很好的例子因爲這是protobuf的format specificationC++, Java, Python implementation.NET implementation

1

這個問題有點混亂,但我有一種感覺,你可能有興趣在Protocol Buffers有效地序列化數據並通過網絡傳輸它。

0
  1. 使用fifo緩衝區。如果你不知道那是什麼,讓我知道你生病沒有問題。 2.使用套接字,不要使用writev。在C#中,使用tcpClient,或者你認爲有必要的東西。 3.在C/C++中,你可以使用struts來對齊你的數據,這樣當你通過線路發送它時,一切都很好,從填充的支柱開始投射到一個指針,然後在調用中使用該指針發送將結構的實際數據大小設置爲數據的Len(因爲發送調用期望char *數據類型,所以不必擔心,因爲一個字節無論如何都是無符號的字符)回到C#中,在C/C++中沒有那麼奢侈,我建議使用一個StringBuilder類將數據收集到它的緩衝區中,如果你知道你的數據大小,它實際上是從線上字節對齊的,你必須(因爲它只是C#中的Unicode,沒有ASCII,第一次將字符串轉換爲ASCII數據類型(這一切都取決於你的機器設置的UTF代碼頁,並根據你的問題ID判斷你不在同一個機器上:),該工作的工具是(我認爲)System.Text.Encoding.GetEncoding(「CodePageString」)。GetBytes( - 插入stringbuilders。ToCharArray函數);並保存所有的字節的緩衝區,你可以從尋找收到數據的lenth要麼關閉套接字調用,或從StringBuilder的,那麼你可以看看你的數據在biniary格式設置,只記得雖然總是使用htons和ntohs(主機到網絡的順序,以及網絡到主機的順序)(不會進入小端和大端)。按照所有這一切,你會中堂0提高警惕;)
相關問題