2010-12-01 27 views
1

winsockでファイル(テキストまたはバイナリ)を送信したい、32768バイトサイズのバッファを持っている、もう一方のバッファサイズは同じですが、パケットサイズが< 32768だったら、どのようにバッファ内のパケットの終わりを判断するか知っているバイナリファイルでは、一意の文字でパケットの終わりをマークすることはできません、そこに任意のソリューション? thxwinsockを使用したファイル転送

答えて

1

固定サイズの「パケット」では、通常、最後のパケットを除くすべてのパケットが有効なデータでいっぱいになります。最後のものだけが「部分的」になり、受信者が何バイトのバイト数を知っていれば(Davitaの提案を使って、送信者がファイルサイズを事前に伝えていたので)、それは問題ありません。受信者は最後のパケットの残りの部分を無視することができます。

複数の部分的に完全なパケットが1つのファイル転送に関連付けられているように、詳細な説明が表示されます。同様に簡単な解決方法があります。それぞれパケットに有効なバイト数をプレフィックスとして付けます。

後でTCustomWinSocket.ReceiveTextに言及し、あなたはそれがテキストを読むことをどのくらい知っている、そしてあなたはそれを充填する前に結果バッファの長さを設定するReceiveBuf(Pointer(nul)^, -1))を呼び出すことで答えを、引用どのように疑問に思います。たぶんあなたはそのコードが何をしているのか分からなかったでしょう。 と同じコードを別の文脈、つまりReceiveLengthの方法で見れば分かります。 ReceiveBufと同じ呼び出しを行い、-1をReceiveBufに渡すと、受け取ったバイト数を返します。

あなたの目的に合うように、固定サイズのパケットを送信することはできません。常に32KBのパケットを送信し、最後にゼロを埋め込むと、ReceiveLengthは常に32768を返し、ファイルとパケットの長さをペイロードと共に送信するDavitaと私のソリューションを組み合わせなければなりません。しかし、パケット内のすべてのバイトが常に有効であることを確認すると、受信者はパケットのサイズに基づいて保存する量を知ることができます。

送信者が送信者に受信者にジョブの実行に必要な情報を提供していることを確認する必要があります。受信者にゴミを有効なデータと区別させることなく、送信者がゴミを送信した場合、あなたは立ち往生しています。

1

ファイル転送を開始する前にいつでもファイルサイズを送信できるため、ファイルへの書き込みをいつ停止するかを知ることができます。

+0

私はそれを試してみると、送信側を変更せずに反対側でそれを判断する解決策を探していた – joe500

+0

ああハングアップ、それを送信する前にパケットサイズを決定することはできませんSendBuffメソッドは送信後amuntsentを返しますパケット、また私は反対側のパケットをcpauterしようとし、パケットサイズが来るのを待っていたが、それはあまりにも複雑になり、可能でないようだ – joe500

+0

Socket.ReciveTextはパケットサイズと実際のデータを決定するが、私は知らない方法=> 関数TCustomWinSocket.ReceiveText:文字列; begin SetLength(Result、ReceiveBuf(Pointer(nil)^、-1)); SetLength(Result、ReceiveBuf(Pointer(Result)^、Length(Result))); end; – joe500

関連する問題