- ベストアンサー
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ファイルは上手く行きました)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
received 変数は初期化してありますか? while( )ループの直前で0にしておいたほうが確実でしょう received = 0; while ( true ){ n_read = Receive( aaa, 22528 ); received += n_read; if ( received >= 22528 ) break; }
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
fopenが失敗したときのことを考えなくてよいですか? 本題とは直接関係ないかもしれません。
補足
あくまで、掲載用に抜粋しただけなので、 その他のエラー処理は実際のプログラミングではコーディングしてあります。 その後イージーミスだったことに気付きました。 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; } に直しました。 受信メッセージをちゃんと取っていなかっただけでした。。。
補足
私のイージーミスでした。 Receiveで1回で受信しきれていないだけでした。