2016-12-20 9 views
0

私はgolangのSIP over TCPモックサービスに取り組んでいます。受信したSIPメッセージは '\ r \ n \ r \ n'シーケンスで区切られています(今はSDPは気にしません)。そのデリミタに基づいてメッセージを抽出し、それを処理ゴルーチンに送りたいと思います。 golangの標準ライブラリを見ると、それを達成するための些細な方法はありません。 iobufioパッケージには店舗はありません。区切り文字として設定 '/ R' とゴランはnet.TCPConnから4バイトをメッセージ分離として読み込みます。

  1. * Reader.ReadBytes機能:現在、私は前方(BUFIOを)行くことの2つのオプションが表示されます。さらに処理はReadByte関数を使用し、デリミタの各バイトと順次比較し、必要に応じてそれらを読み込みません(かなり面倒です)

  2. カスタムスプリット機能でスキャナを使用すると、 。私は、他のより良いオプションがあるかどうかを疑問に思う

、機能性は、それだけで、TCPストリームのための区切り文字を定義し、それからメッセージを抽出することが可能ではないことを信じるのは難しいとなるように、一般的なようです。

答えて

1

自分で読み取りをバッファリングし、\r\n\r\n区切り文字で分割するか、bufio.Scannerにしてください。 scanner.SplitFuncを実装することには煩わしいことは何もありません。これは間違いなく簡単です。例としてbufio.ScanLinesを使用して、あなたが使用できます。

scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) { 
    delim := []byte{'\r', '\n', '\r', '\n'} 
    if atEOF && len(data) == 0 { 
     return 0, nil, nil 
    } 
    if i := bytes.Index(data, delim); i >= 0 { 
     return i + len(delim), data[0:i], nil 
    } 
    if atEOF { 
     return len(data), data, nil 
    } 
    return 0, nil, nil 
} 
+0

作品を魔法のように、簡単に確かに、感謝:) –

関連する問題