通信の受信側での考え方

[戻る]
バース 2005/07/12(火) 18:31:54
開発環境:Win2000 VC6.0 MFC SDI

現在、通信のプログラムを作成しております。

そこで、質問なのですが、送信する側のデータの大きさが可変だった場合、
受信する側のCSocket::Receiveの引数で指定する格納用の変数の大きさをどのようにして
確保しますか?

確保する際の条件として、
 送信されたデータと同じ大きさになるようにする。
 最初から大幅に変数の領域を確保しない。

以上です。
こんな変な質問をしてすいませんが、是非ともみなさんのお考えを聞きたいので
宜しくお願い致します。

KING・王 2005/07/12(火) 19:18:17
> 送信する側のデータの大きさが可変だった場合、

> 確保する際の条件として、
>  送信されたデータと同じ大きさになるようにする。

送信する側のデータの大きさが可変であるのに、受信側で送信されたデータと同じ大きさの領域
を、
(動的に?)確保するのは、無理かと。

受信側は、どのようにして、送信側のサイズを知ればよいのですか?
それがわからないと、動的な領域の確保は難しいと思いますが。。(というか、無理?)

1バイトずつ受信し、それをremallocでも用いながら、加えていく方法もありかもしれません
が、
送信側のデータ終了の判定は、どのようになっているのでしょうか?


少しやり方はかわりますが、私が以前、次のようにして通信させたことがあります。
(1)[送信側]最初に固定長で、これから送信するデータサイズを送信する。
(2)[受信側]固定長でデータを受信し、次に送られてくるデータサイズを受信する。
(3)[送信側](1)で送信したデータサイズのデータ本体を送信する。
(4)[受信側](2)で受信したデータサイズの領域を確保し、そのサイズのデータを受信し、
データ本体を受信する。

CSocketは詳しくないので、関係ないかもしれませんが、以前send(),recv()を直接仕様指定体
時に、
次のような問題がありましたので、参考にして下さい。

先に指名したほう方で、データ本体サイズとして500(バイト)が送信されたとして、
受信側でデータ本体の受信サイズとして500バイトを指定し、
recv()関数で受信を試みました。
しかし、通信の途中でパケットの分割が発生したようで、
recv()関数から制御が戻ってきましたが、受信したデータは250バイトだけでした。
このとき、再度recv()をすると続きのバイトが受信できるということがあり、
結局、recv()した合計が500バイトになるまで、recv()を続けるというようなことがありまし
た。


#長文になってしまいました。ごめんなさい。
#あまり役にたっていないかもしれません。。。orz

古いスレッドには追加発言できません。