メッセンジャーのように独立して処理を行うには?


caps  2005-11-14 05:54:40  No: 59555

今、Winsock、Visual C++.netを使ってメッセンジャーのようなものを作っています。一応チャットはできるようになったのですが、これにファイルの送受信機能をつけたいとおもっています。ここで質問なのですが、ファイルを転送しながらチャットもできるようにするにはどうすればいいのでしょうか?
自分の考えではおそらく、同じソケットで処理するとファイル受信側が、チャット用の文字がデータで送られてきているのか、ファイルのデータが送られてきているのかの判断ができずに、うまく受信できないとおもうのですが。
ファイルを転送しながらでもチャットができるようにするには、ソケットを二個つくって、チャット用のソケットとファイル転送用のソケットをわければいいのでしょうか?
アドバイスよろしくおねがいします。


やましん  2005-11-14 08:29:10  No: 59556

僕はネットワークプログラミングをやったことがないので詳しくはわからないのですが、送受信用データに独自のヘッダを付けて、そのヘッダからチャット用文字データなのかファイル用データなのかを見分ければいいと思います。


επιστημη  2005-11-14 08:29:52  No: 59557

> ファイルを転送しながらでもチャットができるようにするには、ソケットを二個つくって、チャット用のソケットとファイル転送用のソケットをわければいいのでしょうか?

やってみてはいかが?


caps  2005-11-14 17:29:26  No: 59558

アドバイスありがとうございます。
>やましんさん
  なるほど。ヘッダファイルで判別するのですか。ファイル転送の速度をなるべくおとしたくないのですが、この方法だと判別して文字だったら文字の処理、ファイルだったらファイルの処理とわけるのでその間ファイル転送がとまっている状態になりますよね?
>επιστημηさん
  ソケットを二個作るということは、ソケットの名前をかえて、socket()とかbind()とかを二回ずつ繰り返せばいいんですかね?ソケットの名前だけをかえるだけでいいのでしょうか?


επιστημη  2005-11-14 19:25:46  No: 59559

スピード重視なら、ファイル転送は別スレッド起こして裏で処理するんでしょうねぇ。

> ソケットを二個作るということは、ソケットの名前をかえて、socket()とかbind()とかを二回ずつ繰り返せばいいんですかね?ソケットの名前だけをかえるだけでいいのでしょうか?

だからやってみれば?


シャノン  2005-11-14 21:00:53  No: 59560

> ヘッダファイルで判別するのですか。

ヘッダファイルではなくてヘッダです。

ファイルを送るにしろメッセージを送るにしろ、一定サイズに区切って、何回かに分けて送信すると思います。
その区切ったブロックの先頭(ヘッダ部分)に、それがファイルのデータなのかメッセージのデータなのかを識別するデータをくっつけます。
送る側では、ファイルのデータとメッセージのデータを混ぜて送って、受け取る側ではデータのヘッダをもとにどちらのデータなのかを判別して組み立てます。
こうすれば、一見、同時に送れているようには見えます。


caps  2005-11-22 06:44:28  No: 59561

返信遅れてすみません。
ソケットを二個つくってみました。それで、WSAAsyncSelectを実行して、ファイル転送用のソケットに相手からデータがsendされたらFD_READメッセージを発行するようにしました。そしてFD_READメッセージが発行されたらファイルを開いて(作って)、whileの中でrecvでファイルの受信をするようにしました。ですが、うまく送信できません。512kbずつ分割して送ってきているのですが、途中で強制終了になって受信側に作られたファイルは512kbのままです。
おそらく、whileの中で二回目にrecvしたときに相手からsendがきて、それによって受信側にFD_READが発行されて、またファイルを開いてrecvを実行して・・・というふうになっているのだとおもいます。どのようにすれば改善できますかね?アドバイスよろしくおねがいします。


瀬戸っぷ  2005-11-22 09:55:52  No: 59562

>途中で強制終了になって受信側に作られたファイルは512kbのままです。

でしたら、ドコで落ちているのか突き止めましょう。
とりあえず、送信側で512kのデータをsend()しても、
受信側の1回のrecv()で512k受信できるとは限らない。
ということは理解してます?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加