今、Winsock、Visual C++.netを使ってメッセンジャーのようなものを作っています。一応チャットはできるようになったのですが、これにファイルの送受信機能をつけたいとおもっています。ここで質問なのですが、ファイルを転送しながらチャットもできるようにするにはどうすればいいのでしょうか?
自分の考えではおそらく、同じソケットで処理するとファイル受信側が、チャット用の文字がデータで送られてきているのか、ファイルのデータが送られてきているのかの判断ができずに、うまく受信できないとおもうのですが。
ファイルを転送しながらでもチャットができるようにするには、ソケットを二個つくって、チャット用のソケットとファイル転送用のソケットをわければいいのでしょうか?
アドバイスよろしくおねがいします。
僕はネットワークプログラミングをやったことがないので詳しくはわからないのですが、送受信用データに独自のヘッダを付けて、そのヘッダからチャット用文字データなのかファイル用データなのかを見分ければいいと思います。
> ファイルを転送しながらでもチャットができるようにするには、ソケットを二個つくって、チャット用のソケットとファイル転送用のソケットをわければいいのでしょうか?
やってみてはいかが?
アドバイスありがとうございます。
>やましんさん
なるほど。ヘッダファイルで判別するのですか。ファイル転送の速度をなるべくおとしたくないのですが、この方法だと判別して文字だったら文字の処理、ファイルだったらファイルの処理とわけるのでその間ファイル転送がとまっている状態になりますよね?
>επιστημηさん
ソケットを二個作るということは、ソケットの名前をかえて、socket()とかbind()とかを二回ずつ繰り返せばいいんですかね?ソケットの名前だけをかえるだけでいいのでしょうか?
スピード重視なら、ファイル転送は別スレッド起こして裏で処理するんでしょうねぇ。
> ソケットを二個作るということは、ソケットの名前をかえて、socket()とかbind()とかを二回ずつ繰り返せばいいんですかね?ソケットの名前だけをかえるだけでいいのでしょうか?
だからやってみれば?
> ヘッダファイルで判別するのですか。
ヘッダファイルではなくてヘッダです。
ファイルを送るにしろメッセージを送るにしろ、一定サイズに区切って、何回かに分けて送信すると思います。
その区切ったブロックの先頭(ヘッダ部分)に、それがファイルのデータなのかメッセージのデータなのかを識別するデータをくっつけます。
送る側では、ファイルのデータとメッセージのデータを混ぜて送って、受け取る側ではデータのヘッダをもとにどちらのデータなのかを判別して組み立てます。
こうすれば、一見、同時に送れているようには見えます。
返信遅れてすみません。
ソケットを二個つくってみました。それで、WSAAsyncSelectを実行して、ファイル転送用のソケットに相手からデータがsendされたらFD_READメッセージを発行するようにしました。そしてFD_READメッセージが発行されたらファイルを開いて(作って)、whileの中でrecvでファイルの受信をするようにしました。ですが、うまく送信できません。512kbずつ分割して送ってきているのですが、途中で強制終了になって受信側に作られたファイルは512kbのままです。
おそらく、whileの中で二回目にrecvしたときに相手からsendがきて、それによって受信側にFD_READが発行されて、またファイルを開いてrecvを実行して・・・というふうになっているのだとおもいます。どのようにすれば改善できますかね?アドバイスよろしくおねがいします。
>途中で強制終了になって受信側に作られたファイルは512kbのままです。
でしたら、ドコで落ちているのか突き止めましょう。
とりあえず、送信側で512kのデータをsend()しても、
受信側の1回のrecv()で512k受信できるとは限らない。
ということは理解してます?
ツイート | ![]() |