2017-04-07 13 views
0

私は、会社と統合しようとしていますし、彼らは私が何の問題も接続されていない得ることができますが、私はオフに基づいてデータを送信する問題が生じています、私は送信ソケット

精通していないですソケットを使用しているもの、彼ら彼らは、彼らは、メッセージデータが欲しいが、ASCIIエンコーディング

でこれをするメッセージ長 始まり、バイナリ

の整数であり、彼らはこれを望む4つの他のフィールドヘッダーレコードと呼んたい

たい

私は最初の部分にバイナリライターを使用してアスキーを追加してみるべきかどうかわかりません

これはバイトですので変更できないと思います実際

誰かが私に提案や、彼らはそれがこの問題で私のために働くと思うだろういくつかのサンプルを与えることができます

+0

受信データからアレイに4バイトを読み込みます。 BitConvertを使用して配列をintまたはuintに変換します。 BitConverter.ToUInt32(配列、0);長さが2^31を超えるかどうかを確認する必要があります(unsigned int) – jdweng

答えて

0
私の提案は最初からを 「コンバーチブル」になりますMessageクラスを作成することです

byte[]タイプに変更します。次に、Streamから派生したNetStreamを作成し、これを使用して指定したSocketでデータを送信します。ソケット通信に関する追加の知識をまったく必要としないソリューションを維持するのは簡単です。
コード例:

// include these namespaces : 
using System; 
using System.Collections.Generic; 

public class Message 
{ 
    int m_MessageLength; 
    // your other fields 
    char m_OtherField1; 
    char m_OtherField2; 
    char m_OtherField3; 
    char m_OtherField4; 
    // message content as I assume is string 
    string m_MessageContent; 

    public Message(string message, int field1, int field2, int field3, int field4) 
    { 
     m_MessageConten = message; 
     m_OtherField1 = field1; 
     m_OtherField2 = field2; 
     m_OtherField3 = field3; 
     m_OtherField4 = field4; 
    } 

    public static explicit operator byte[](this Message message) 
    { 
     List<byte> buffer = new List<byte>(); 
     // 4 fields each 2bytes wide gives us 16 bytes 
     // ASCII character is 7 bits wide but is packed into 8 bits which is 1byte 
     // gives us the result of (length_of_message * 1byte == length_of_message) 
     buffer.AddRange(BitConverter.GetBytes(8 + m_MessageContent.Length)); 
     buffer.AddRange(BitConverter.GetBytes(m_OtherField1)); 
     buffer.AddRange(BitConverter.GetBytes(m_OtherField2)); 
     buffer.AddRange(BitConverter.GetBytes(m_OtherField3)); 
     buffer.AddRange(BitConverter.GetBytes(m_OtherField4)); 
     buffer.AddRange(Encoding.ASCII.GetBytes(m_MessageContent)); 
     return buffer.ToArray(); 
    } 
} 

このオブジェクトはあなただけSocket.Sendメソッドを使用することができます持つ:それは十分ではない場合

Message message = new Message("hello world", 1, 3, 3, 7); 
meSocket.Send((byte[])message); 

はちょうど私が知っていると私はより多くの詳細と、この答えを更新します。

+1

長さ接頭辞とヌルターミネーターの両方を行う理由はありません。ヌルターミネータを使用する理由は、最初にメッセージの長さを送信できないためです。 –

+0

@ScottChamberlain Seamsが妥当です。私はそれを編集します、ありがとう:) –

+0

@ m.rogalski簡単な質問私はあなたがintsがこの会社の4バイトであると言うのを見ますそれは最初の4つのフィールドに探しているか2bytesのように見えるでしょう彼らはintergersではないそれで? – quatre432

関連する問題