開発環境:Win2000 VC6.0 MFC SDI
現在、通信のプログラムを作成しております。
そこで、質問なのですが、送信する側のデータの大きさが可変だった場合、
受信する側のCSocket::Receiveの引数で指定する格納用の変数の大きさをどのようにして
確保しますか?
確保する際の条件として、
送信されたデータと同じ大きさになるようにする。
最初から大幅に変数の領域を確保しない。
以上です。
こんな変な質問をしてすいませんが、是非ともみなさんのお考えを聞きたいので
宜しくお願い致します。
> 送信する側のデータの大きさが可変だった場合、
> 確保する際の条件として、
> 送信されたデータと同じ大きさになるようにする。
送信する側のデータの大きさが可変であるのに、受信側で送信されたデータと同じ大きさの領域
を、
(動的に?)確保するのは、無理かと。
受信側は、どのようにして、送信側のサイズを知ればよいのですか?
それがわからないと、動的な領域の確保は難しいと思いますが。。(というか、無理?)
1バイトずつ受信し、それをremallocでも用いながら、加えていく方法もありかもしれません
が、
送信側のデータ終了の判定は、どのようになっているのでしょうか?
少しやり方はかわりますが、私が以前、次のようにして通信させたことがあります。
(1)[送信側]最初に固定長で、これから送信するデータサイズを送信する。
(2)[受信側]固定長でデータを受信し、次に送られてくるデータサイズを受信する。
(3)[送信側](1)で送信したデータサイズのデータ本体を送信する。
(4)[受信側](2)で受信したデータサイズの領域を確保し、そのサイズのデータを受信し、
データ本体を受信する。
CSocketは詳しくないので、関係ないかもしれませんが、以前send(),recv()を直接仕様指定体
時に、
次のような問題がありましたので、参考にして下さい。
先に指名したほう方で、データ本体サイズとして500(バイト)が送信されたとして、
受信側でデータ本体の受信サイズとして500バイトを指定し、
recv()関数で受信を試みました。
しかし、通信の途中でパケットの分割が発生したようで、
recv()関数から制御が戻ってきましたが、受信したデータは250バイトだけでした。
このとき、再度recv()をすると続きのバイトが受信できるということがあり、
結局、recv()した合計が500バイトになるまで、recv()を続けるというようなことがありまし
た。
#長文になってしまいました。ごめんなさい。
#あまり役にたっていないかもしれません。。。orz