2016-08-06 8 views
0

ノード関数を使用して、ヘッダとペイロードで構成されるバッファをコンパイルしています。ヘッダの第1項はサーバに送信されるバッファの合計サイズであり、第2要素はサーバに送信されるコマンドであり、次にペイロードがバッファに追加される。必要なバッファーの長さを計算するときにNPMのbufferpack.jsライブラリーを使用して、バッファーが作成された後と同じサイズを取得していて、バッファーの長さプロパティーを取得します。ノードsocket.writeは、元のバッファよりも多くのバイトを返します。

私が見ている問題は、バッファが127バイトを超えると、書き込まれたバイト数が実際のバッファのバイト数と一致しないということです。これは余分なバイトで何をすべきか分からないため、サーバー上で問題を引き起こしています。ここで

は、システムが正常に動作し、バイト時に、私は、バッファにデータを変換して、サーバーここで

_sendall(cmd, payload='', callback){ 
    console.log('payload:', payload.length) 
    let fmt = '>HB' 
    let size = struct.calcLength(fmt) + payload.length 
    console.log('size:',size) 
    let header = [size, cmd] 
    let buf = struct.pack(fmt, header) + payload 
    console.log('buf:', buf.length) 
    console.log('[INFO] Buffer Sent:',buf) 
    this.sock.write(buf, 'binary', (err)=>{ 
    console.log('[INFO] Bytes written now:', this.sock.bytesWritten-this._bytesWrittenPrevious) 
    console.log('[INFO] Total Bytes Written:', this.sock.bytesWritten) 
    this._bytesWrittenPrevious = this.sock.bytesWritten 
    if (err) { 
     console.log('[ERROR] _sendall:', err) 
     return callback(false) 
    } 
    return callback(true) 
    }) 
} 

にバッファを送信するために使用しています方法は、コンソール出力の例ですバッファのサイズと一致して送信されます。サーバーは応答し、すべてが世界で正しいです。ここで

[INFO] Sending the input setup 
payload: 20 
size: 23 
buf: 23 
[INFO] Buffer Sent: Iinput_int_register_0 
[INFO] Bytes written now: 23 
[INFO] Total Bytes Written: 143 

は、システムが正常に動作していないと、サーバーが応答を返したことがないとき、私は見ていて火決してコールバックがあるので、コードがハングアップするものです。

[INFO] Sending the input setup 
payload: 143 
size: 146 
buf: 146 
[INFO] Buffer Sent: �Iinput_double_register_0,input_double_register_1,input_double_register_2,input_double_register_3,input_double_register_4,input_double_register_5 
[INFO] Bytes written now: 148 
[INFO] Total Bytes Written: 291 

何が起こっているのですか?私はこのような問題に関して何かを見つけることができなかったので、どんな助けも大歓迎です。

UPDATE:

私はsock.writeにエンコーディングに@mscdexが推奨する変更を加えたし、今私は私が送信していますが、私はまだ問題を抱えています同じバイト数を書いています。私はbufferpack.jsライブラリを使用してunsigned short(H)としてエンコードされているsize要素に絞り込んだ。いつでもサイズが127以上です。バッファをアンパックしようとすると、エンコーディングが間違っていると思います。サイズのNaN戻り値を取得しています。問題の解決に取り組んでいます。

答えて

1

バイナリデータを送信する場合、エンコードに'utf8'を指定したくない場合。あなたは実際にバイナリデータの文字列の代わりにBufferオブジェクトを使用する必要があります。ただし、バイナリ文字列を書き込むには、代わりに'binary'エンコーディングを使用できます。これにより、文字列はUTF-8として解釈されません。

+0

おかげで、今で建設されたバッファのサイズに合わせ書き込まれたバイトのサイズを作った:

は、ここで期待どおりに動作新しいコードです。 –

0

最後に、バッファをパッキングするためにbufferpack.jsライブラリを削除してプログラムを動作させることができました。バッファのサイズが127バイトを超えると、正しく送信されていたバッファのサイズがエンコードされていないように見えます。 fmt変数のHは、バイトを符号なしのショートとしてフォーマットすると考えられていましたが、符号付きのshortを探しているようですが、これは私がhを使用して同じ結果を得たので、署名されたショートです。

問題を解決するために、ネイティブバッファ書き込みメソッドを使用するように切り替えました。これが問題を解決しました。私はbufferpack.jsを調べ、問題を見つけて、それを修正できるならば、repoにPRを投稿するかどうかを見ていきます。

_sendall(cmd, payload='', callback){ 
    let fmt = '>HB' 
    let size = struct.calcLength(fmt) + payload.length 
    let header = [size, cmd] 
    let buf = new Buffer(size) 
    buf.writeUInt16BE(size, 0) 
    buf.writeInt8(cmd, 2) 
    buf.write(payload.toString(), 3) 
    this.sock.write(buf, 'binary', (err)=>{ 
    console.log('[INFO] Bytes written now:', this.sock.bytesWritten-this._bytesWrittenPrevious) 
    console.log('[INFO] Total Bytes Written:', this.sock.bytesWritten) 
    this._bytesWrittenPrevious = this.sock.bytesWritten 
    if (err) { 
     console.log('[ERROR] _sendall:', err) 
     return callback(false) 
    } 
    return callback(true) 
    }) 
} 
+0

もしあなたがBuffersを使っているのであれば、 '' binary ''という引数はまったく必要ありません(文字列だけです)。 'write(buf、(err)=> {...})' – mscdex

関連する問題