• ベストアンサー

ファイル送受信のためのネットワークプログラミング

現在、CSocketを用いて、クライアントPCとサーバとの メッセージの送受信プログラムを作成しています。 文字列での送受信は出来たのですが、 ファイルを送受信する方法が分かりません。 CSocketやCAsyncSocketでは、ファイルの送受信は出来ないのでしょうか?

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

  • ベストアンサー
  • kt1965
  • ベストアンサー率34% (116/339)
回答No.1

回答します。 同じ考え方で出来ますよ。 以下、フロー。 送信側 1.「文字列」に「ファイル」を読み込む。 2.CSoketで「文字列」を送信。 受信側 1.CSoketで「文字列」を受信 2.「文字列」を「ファイル」に書き出す。 では。

lhouse
質問者

お礼

なるほど。 ファイルそのものを送受信しようとしていましたが、 ファイルの中身を送受信して、 クライアント側で、ファイルを作成するのですね。 盲点でした。 試してみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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ファイルは上手く行きました)

  • C言語でのネットワークプログラミング

    現在Linuxを用いてC言語でTCP/IPのサーバ、クライアントプログラムを作成しています。 sendとrecvの正しい使い方がわかっておりません。 一度のrecvですべてのデータを受け取れないことはわかっているのですが、どのように記述するのが良いのでしょうか。1バイトずつrecvするのは大間違いであると何処かのサイトで読みました。 ・現在の仕様 サーバがデータの文字列をsendで送ってくる クライアントはrecvで1バイト読み込みを繰り返し、配列に格納し、\0を見つけるとループを抜ける recvした文字列を画面表示 表示したあとはrecvに戻る

  • socketプログラミングについて

    C++でsocketの練習のためにソケットを開き、文字列の送信を行うだけのサーバクライアントプログラムを作成したのですが、どうも上手く動作してくれません。 クライアント→サーバへ文字列を送信する前に、 1.サーバがソケットを開き、9999ポートでアクセスを待つ 2.クライアントがソケットを作成し、サーバの9999ポートにアクセスする 3.クライアントが文字列をサーバへ送信し、サーバが文字列を表示 ということをしたいのですが、2の部分でつまずいています。 プログラムをネットワークに接続されているコンピュータ上で実行すると動作するのですが、(client 192.168.15.17 9999)単独でサーバ・クライアントを起動させ、localhost当てに接続(client localhost 9999)しようとしても「No route to host」と表示されて、接続すら出来ません。 ためしにサーバを起動させている状態で「telnet localhost 9999」とするとどうやらサーバに接続されているようです。 localhostでやる場合は特別なソケット操作が必要になるのでしょうか?

  • javaでのプログラミングで・・・

    今、大学の課題で、javaで簡易ファイルの転送プログラムを作成しています。 サーバーとクライアントの両方を作成したのですが、追加課題の回答がわからないので、回答お願いします。 (1)特定の文字列でくくる以外の処理でデータ部分を区別できる方法を具体的に述べよ。 (2)サーバーとクライアント間で共通化できる部分はどこか。また、どのように利用するかを述べよ。 以上2つの質問の回答をお願いします。

    • ベストアンサー
    • Java
  • 受信待機

    こんばんは。 現在通信機能をもつアプリケーションを作成しています。 CSocketを使用して、同期通信です。 質問です。 クライアントから、サーバにメッセージを投げます。 するとサーバはこのメッセージを解析して、ローカルで処理をし、その結果をクライアントに返します。 問題なのは、クライアントでは、サーバからの結果を受信してからその次の処理を行いたいので、受信待機したいのですが、その方法がわからないのです。 このような処理の方法をご教授ください。 よろしくお願いします。

  • ネットワークプログラミングについて

    今、僕はネットワークプログラミングを勉強中です 今日、linuxで教科書の例題レベルの簡単なサーバプログラムを作って それを実行させて windowsでwinsock2を用いてクライアントプログラムを作って 実行させて 同じLAN内の違うパソコンにメッセージを送るプログラムを作ったのですが なぜかconnectができません. 同じLAN内でも winsock2同士で作ったwindows同士では メッセージをうまく送れました. しかし windowsとlinuxの間だとどうしてもconnectができません なぜだか全くわかりません. windows同士, linux同士だとうまくいくようです. よろしくお願いします.

  • ドメインネットワークのファイルの共有

    ネットワーク初心者です。 現在サーバー1台、クライアントPC5台(全てXPpro)でドメインネットワーク構成しています。 ドメイン内でのファイルの共有が上手くいきません。 サーバーから各クライアントのファイルは「フルコントロール」できますが、クライアント同士では、エラーメッセージで「アクセス許可がない為アクセスできません。」と表示されてしまいます。 各クライアントのユーザーグループは"domain adminis"で各クライアントPCのCドライブ(共有したいドライブ)に「フルコントロール」できるように設定してあります。 どのような理由が考えられるでしょうか?? できれば対処法を詳しくお教え下さい。 よろしくお願いします。 サーバー:Windows2003スタンダード   PC:WinXP Pro

  • CSocket通信での待機処理について

    VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。 クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。 thread_start→マルチスレッド作成→ CSocket::Sendでサーバへメッセージ送信→ CSocket::OnReceiveでサーバのメッセージ受信→ サーバメッセージから処理実行と言った流れです。 通常の処理は、この流れで問題ないのですが、 ある処理の場合、thread_startをforループで数回繰り返す 処理を行っています。 この時、データにタイムラグが出てしまうため、 thread_startから処理実行までの一連の流れが終了するまで、 次のthread_startは呼ばれずに待機させたいのですが、 どのようにすれば良いのかが分かりません。 Sendを呼んだタイミングで、 WaitForSingleObjectでスレッドのハンドルを渡したり、 CreateEventでイベントハンドルを渡したりしてみたのですが、 WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で 止まってしまうため、そのままフリーズ状態になってしまいます。 どのタイミングでWaitFor~を呼ぶべきなのか、 もしくは、何か別の手段があるのでしょうか?

  • winsock 送受信

    VB6を使っていますが、詳しくないので質問させていただきます。 とりあえず同じPCでwinsockを用いてサーバとクライアントを接続させてデータを送受信するプログラムをつくっています。 データの送受信senddataとDataArrivalのところで悩んでいるのですが、senddataを数箇所用いていて、送ったデータは GetData 変数 により全て同じ変数にされてしまいます。 サーバでtemp=10とi=1のデータを送ると、クライアントでもそのtemp=10とi=1のデータ両方が使いたいわけですが、どうすればいいでしょうか?

  • マルチスレッドでCSocket::Createを呼ぶと落ちる

    VC++2008にて、サーバとクライアントPCの相互通信により、 クライアントPC側で、サーバデータを表示する エクスプローラもどきを作成しています。 サーバ側は、複数台のPCと送受信を行うため、 通信部分をマルチスレッド化しているのですが、 クライアント側は、基本的には、シングルスレッドでOKと考え、 通信部分はマルチスレッド化していませんでした。 クライアントで、ファイルアイコンをクリックしたら、 ファイルデータを受信して、ファイルをオープンし、 クローズすると、サーバへ上書きしに行く部分を、 マルチスレッドにて作成しました。 (ファイルオープンの箇所からマルチスレッド化) 問題が起こっているのは、クローズ後に、 ファイル上書きのために、CSocket派生クラスをCreateすると 落ちてしまうことです。 シングルスレッドでは、Createも正常に通るので、 マルチスレッドから、Createを呼んでることが 原因だとは思うのですが、なぜ原因となっているのか? また、どのように修正すれば良いかが分かりません。 説明が分かりづらいかもしれませんが、よろしくお願いします。

筆まめ住所録が開かない
このQ&Aのポイント
  • win10で筆まめ31を使用中。既存の住所録を開こうとすると、ファイル読み込に使用するエンコード方法を選択してください、というメッセージ。
  • 選択肢はwindows(規定値)、MS-DOS、その他(沢山の言語が表示される)です。
  • どれを選択してもうまくいきません。
回答を見る

専門家に質問してみよう