はじめまして。CSocketとアーカイブを使って2台のPC(PC1,PC2)から1台のPC(PC3)へ
データを送信するプログラミングを作っているのですが、同じタイミングで0.5秒おきに
double型のデータ(1000個ほど)を送信していると何秒後かに送信側のPCの動作が止まって
しまいます。連続で動かし続けたいのですがどうしたらいいのでしょうか。
開発環境はVC++5.0 SP3 Windows2000です。
データを送信する部分のソースはこんなかんじです。
for(int i=0;i<1000;i++){
*m_lpOutput << double[i];
m_lpOutput->Flush();
}
宜しくお願いいたします。
for(int i=0;i<1000;i++){
*m_lpOutput << double[i];
m_lpOutput->Flush();
}
のdouble[i]はdata[i]の間違いでした。double型のdata[i]です。
> m_lpOutput->Flush();
これ100単位くらいにすることできますか
実際CSocketでのプログラミングやったこと無いけど
DBアクセスで言うところのCOMMITに相当するんですよね
>何秒後かに送信側のPCの動作が止まって
OSごと固まってしまうんですか
それともアプリケーションのみですか(ほかのプログラム動きますか ワードなど)
>同じタイミング
と言うところに問題は無いのでしょうか
>> m_lpOutput->Flush();
>これ100単位くらいにすることできますか
100単位というのはどういうことでしょうか。毎回フラッシュするのではなく、
100回に1回の割合にするということでしょうか。
>>何秒後かに送信側のPCの動作が止まって
>OSごと固まってしまうんですか
>それともアプリケーションのみですか
アプリケーションのみ止まります。送信側のPCがメッセージを受け取らなく
なってしまいます。
>>同じタイミング
>と言うところに問題は無いのでしょうか
正確には同じタイミングで送信する必要はあまりないので、
送信のタイミングを0.25秒ずらして交互に送信してみましたが
やはり、途中で止まってしまいました。(同じタイミングで
送信したときよりも止まるのは遅かったですが・・・)
>100回に1回の割合にするということでしょうか
そうです
>アプリケーションのみ止まります。送信側のPCがメッセージを受け取らなく
>なってしまいます。
尚、受け取らないのは受信側ではないの?
アプリケーションが止まったときエクスプローラなどでのネットワーク参照できますか
途中で止まってしまうとは、どんなタイミングなんでしょう?
> *m_lpOutput << double[i];
この呼び出しが戻ってこないのか、
あるいはソケットの作成時、Connect時、アーカイブの作成時か、
などは特定できませんか?
また、何秒後などでなく
具体的に送信する関数をある回数呼び出したときにとまるということは
ないのですか?
また、ソケットやアーカイブを
newで作成しているのであれば、ちゃんとdeleteしてますか?
送信側のPCを1台にすると止まることはないのですが、2台にすると
1台だけ動作が停止して、データを送信していないように思えます。
停止したPCは終了ボタンやメニューも受け付けなくなりました。
PC2台からPC1台へのデータの送信は根本的に難しいのでしょうか。
また、データの数を減らしてみたら(1000→10)うまく
いきました。データの数を減らさずに実行する方法はあるのでしょうか。
>尚、受け取らないのは受信側ではないの?
受信側にデータが届いていない感じです。
>アプリケーションが止まったときエクスプローラなどでのネットワーク参照できますか
できました。
>あるいはソケットの作成時、Connect時、アーカイブの作成時か、
>などは特定できませんか?
それらは、アプリケーション起動時に行っているので関係ないように思います。
>また、何秒後などでなく
>具体的に送信する関数をある回数呼び出したときにとまるということは
>ないのですか?
回数はあまり関係ないように思います。
>また、ソケットやアーカイブを
>newで作成しているのであれば、ちゃんとdeleteしてますか?
大丈夫だと思います。
PC3では、2つの CSocket を用意していますか?
また、それぞれ別ポートを使用していますか?
PC1<======>PC3 と
PC2<======>PC3 とで、別々のポートを用意して
通信すれば、止まることは、ないと思いますが。。。。
同期型通信と非同期型通信あると思うのですが
その辺に問題は無いのでしょうか
文書読んだ程度なのでこんなことしかいえませんけど
>また、データの数を減らしてみたら(1000→10)うまく
>いきました。データの数を減らさずに実行する方法はあるのでしょうか。
10に減らした場合はうまくいくということは,
単純に0.5秒間の間にfor文を処理しきれていないのでは??
処理が終わっていないのにタイマーイベントが呼び出されておかしくなってしまう
のでは?
サーバ側よりもむしろクライアント側に問題があるような気がします.
データ数を500個程度に減らし、型もdouble型からfloat型にしたところ、
丸一日連続して送信が成功したので、やはり0.5秒間に処理しきれていなかったん
だと思います。
データの送受信と関係がないのですが、処理が間に合わなかった場合
タイマーイベントを呼び出さない方法はなにかあるのでしょうか。
データ数を500個程度に減らし、型もdouble型からfloat型にしたところ、
丸一日連続して送信が成功したので、やはり0.5秒間に処理しきれていなかったん
だと思います。
データの送受信と関係がないのですが、処理が間に合わなかった場合
タイマーイベントを呼び出さない方法はなにかあるのでしょうか。