• ベストアンサー

Officeファイルの送受信

CSocketを使って、Serverとのネットワークプログラムを 作成していますが、ファイルの送受信が上手く出来ず、困っています。 Server側で指定ファイルデータを読み込み、 Client側でファイルを作成し、オープンすると 中身が壊れていますとメッセージが出てしまいます。 下記は、ファイル送受信のためだけに、 暫定的に組んだソースの抜粋になります。 /* Server側のCAsyncSocket派生クラスのSend関数 -------------- */ int CServerSocket::Send( int nFlags ) { FILE *fp; char *pBuffer; fp = fopen( "C:\\a.doc", "rb" ); /* ファイルサイズを取得する */ long current = ftell( fp ); fseek( fp, 0, SEEK_END ); long size = ftell( fp ); fseek( fp, current, SEEK_SET ); /* ファイルデータ読み込み */ pBuffer = new char[size]; fread( pBuffer, sizeof(char), size, fp ); fclose( fp ); return CAsyncSocket::Send( pBuffer, size, nFlags ); } /* Client側のCSocket派生クラスのOnReceive関数 -------------- */ void CClientSocket::OnReceive( int nErrorCode ) { char aaa[22529]; while ( true ){ n_read = Receive( aaa, 22528 ); received += n_read; if ( received >= 22528 ) break; } Close(); ShutDown(); FILE *fp; fp = fopen( "C:\\test.doc", "wb" ); fwrite( aaa, sizeof(char), 22528, fp ); fclose( fp ); } ※テスト版ということで、Client側では、とりあえず、送信サイズ(ファイルデータサイズ)は  分かっているので、固定にしています。 このような送受信では、Officeファイルの送受信はうまく行かないものなのでしょうか?(ちなみにtxtファイルは上手く行きました)

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

received 変数は初期化してありますか? while( )ループの直前で0にしておいたほうが確実でしょう received = 0; while ( true ){ n_read = Receive( aaa, 22528 ); received += n_read; if ( received >= 22528 ) break; }

lhouse
質問者

補足

私のイージーミスでした。 Receiveで1回で受信しきれていないだけでした。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

fopenが失敗したときのことを考えなくてよいですか? 本題とは直接関係ないかもしれません。

lhouse
質問者

補足

あくまで、掲載用に抜粋しただけなので、 その他のエラー処理は実際のプログラミングではコーディングしてあります。 その後イージーミスだったことに気付きました。 Client側を char aaa[22529], bbb[22529]; while ( true ){ n_read = Receive( aaa, 22528 ); for ( i = 0; i < n_read; i++ ){ bbb[received+i] = aaa[i]; } received += n_read; if ( received >= 22528 ) break; } に直しました。 受信メッセージをちゃんと取っていなかっただけでした。。。

関連するQ&A