2012-04-09 96 views
0

作爲我們項目的一部分,我們需要決定如何使用數據報包中的套接字發送結構。爲了做到這一點,我們不會假設通過任何第三方庫使用任何序列化。從我所想到的是將結構字段編碼到緩衝區中。將消息格式編碼到緩衝區以通過UDP套接字發送?

例如。

struct message { 
    int sequence_number; 
    string datamessage; 
} 

現在送這個結構,我們將編碼這這將是這樣的

/S 「sizeofmessage」/我 「sequence_number」/數據 「datamessage」

緩衝區

有沒有更好的方法來實現這一目標?

回答

0

只要格式包含足夠的信息以供接收端重建struct message,您就可以以任何方式序列化數據。

我不找你提出的格式非常明確:

/s"sizeofmessage"/i"sequence_number"/data"datamessage" 

我不知道你的意思是對於那些引號是在消息中逐字,我不知道你的意思消息的大小和序列號應該用ASCII或其他的方式編碼爲十進制字符串。

您應該決定您的協議是否需要以允許接收方識別新消息格式的方式進行擴展,以防將來添加更多字段。您需要決定是否硬編碼某些僅處理上面呈現的非常簡單的結構的代碼,或者如果您想要可能處理不同結構的更靈活的東西。請記住,您使序列化格式更具可擴展性和靈活性,您就越有可能試圖改變您決定不使用現成的序列化庫。

但是讓我們假設你想保持它非常簡單,並設計一些只處理這個特定結構的東西。

這裏的東西很簡單,將工作你的情況:

  • 發送的序列號。例如:
    • 作爲網絡字節順序(大端)的4字節整數。
    • 與數字的十進制數的ASCII碼發送,終止了與您所選擇的非數字字符,如' '(空間)
    • (或其他任何明確地解碼)
  • 發送字符串作爲字節序列。

由於您使用的是UDP(數據報套接字),您不需要發送字符串的長度或以任何特殊字符終止它。接收機將知道在序列號被解碼之後的所有剩餘字節構成字符串。

只要您的郵件都適合單個UDP數據包(即,它們不大於大約64KB)。

+0

謝謝!這是非常有用的。我明白你的意思,我們的協議有兩種類型的消息數據消息和控制消息。根據我所理解的,我應該將消息的序列號與消息的一部分字符串分開發送嗎? 如果持有序列號的數據報未傳遞或延遲,以致於在此之前傳遞字符串,該怎麼辦?我很困惑這個想法。 – 2012-04-10 14:07:29

+0

不,我的意思是建議序列號和字符串應該在同一個UDP數據報中串聯在一起。對不起,暗示否則。現在,如果你有兩種不同類型的消息,那麼(1)每一條消息都應該從一個鑑別器開始,它允許接收器把它們分開,這可能只是消息開始時的單個字節,或(2)數據和控制消息應發送到不同的UDP端口。 – Celada 2012-04-10 15:09:48

相關問題