2012-01-26 37 views
1

私はソケットプログラミングC#(.NET)で私の手をしようとしています。私はcodeprojectからいくつかの例を参照しましたが、私のファイル転送は常に不完全なデータを送信します。ソケットファイル転送Cで不完全なファイルを送信

非常に小さいサイズのデータ​​は、1kBのように正常に動作します。しかし、大きなファイルは、不完全な、特に画像が転送されます。

私のクライアントコードは、サーバーにファイルを送信します。 clientDataは、ファイルのバイナリを格納します。

ここでは、ファイルを受信するサーバーのコードです。

   sock.Listen(100); 

      curMsg = "Running and waiting to receive file."; 
      Socket clientSock = sock.Accept(); 

      byte[] clientData = new byte[1024 * 5000]; 

      int receivedBytesLen = clientSock.Receive(clientData); 
      curMsg = "Receiving data..."; 

      int fileNameLen = BitConverter.ToInt32(clientData, 0); 
      string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen); 

      BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ; 
      bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen); 

      curMsg = "Saving file..."; 

      bWrite.Close(); 
      clientSock.Close(); 

面白いのは、クライアントで「送信」でブレークポイントを設定すると、ファイルが正常に転送されることです。私は受信バイトがクライアントで転送されたバイトよりも小さいときに、私はブレークポイントを使用するとき両端のバイト数と転送バイトが一致しているのを見ている。

私は間違っていますか?

+0

チャンクでデータを送信するために作成したコードをアップロードできますか? – AndroidLearner

+0

使用しているClose()のオーバーロードは、送受信が「終了」するまで待機せず、タイムアウトのあるオーバーロードを使用する必要があるため、送信ストリームを「パージ」する時間があります。 –

答えて

2

プロトコルを実装するのを忘れてしまった! TCPを使用するには、送信されるバイト数と、受信者がメッセージまたはプロトコルデータ要素をどのように識別するかを定義するプロトコルを設計および実装する必要があります。あなたはこれをしていません。受信コードにはファイル全体を受信したかどうかを知る方法がありません。送信するプロトコルがなく、そのようなプロトコルを実装するコードもないためです。もちろん、それは間違っています - それを正しくする方法はありません。

receivedBytesLenが1の場合、コードはひどく失敗します。

+0

こんにちはDavid。ソケットを初期化するために次のコードを使用していますが、私はProtocolType.IPが役に立ちそうだと仮定しました。 'ipEnd =新しいIPEndPoint(IPAddress.Any、5656); sock =新しいソケット(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.IP); sock.Bind(ipEnd); ' –

+0

ProtocolType.IpをProtocolType.Tcpに変更しました。まだ運がありません。私は絶対初心者です、あなたは具体的になることができます。 –

+0

私の答えは全く分かりませんでした。ファイルを送信しようとしています。 TCPはファイルを転送するためのプロトコルではなく、バイトを転送するためのプロトコルです。ファイルを転送するには、ファイルを転送するためのプロトコルが必要です。 1行のコードを書く前に、そのようなプロトコルを設計して文書化する必要があります。 –

1

基本となるネットワーク層またはTCP層が、ファイル全体を1つのチャンクとして送信するとは限りません。ファイルの正確な長さ/完全な長さを受け取るまで、whileループを試してみてください。

これを行うには、まずファイルの長さを送信する必要があります。

はい、これはデバッグモードでは動作しますが、実行時には異なる場合があります。

+0

ありがとうMuthu、 まず、ファイルサイズをハードコーディングしてみました。ビットを正しく受信しました。バッファが上書きされます。 –

+0

はい、別のバイト配列またはリストにこれを追加する必要があります。この後に上書きしないでください。 – Muthu

関連する問題