C言語関係掲示板

過去ログ

No.932 recvfromによるメッセージ受信について

[戻る] [ホームページ]
No.11845

recvfromによるメッセージ受信について
投稿者---Aqua(2004/01/16 14:28:45)


こんにちは。

クライアントマシンからsendtoで送信したメッセージを
サーバマシンのrecvfromで受信して、
そのメッセージをファイルへ書き出すプログラムを作成しているのですが、
例えば「Hello World」などのメッセージを100行とか200行くらい
連続出力させる時は問題ないのですが、
1000行同じ事をしようとすると300行分くらいが出力されず
10000行だと4000〜6000行分くらいが出力されずに終わってしまいます。
この原因としては何が考えられるでしょうか。
また、何か解決策はありますか。

環境のほうは、OSがFreeBSDでコンパイラはgccを使っています。

No.11868

Re:recvfromによるメッセージ受信について
投稿者---namani(2004/01/16 17:45:51)


UDPだと確実に送られる保証がないので、ロスがおきる可能性がありますね
うちで試してみたら(Solaris8+gcc2.95)
while文でノンストップで送り続けた場合、素敵に7割ロスしました(−−;
送る際に1回ごとにちょっと間を置くようにしたらロスしなくなりました。
(その分えらく遅くなりますが)
確実に送るのでしたらTCPでやったほうがいいですね。
それかチェック機構を自分でつくるとか・・・。

この辺の少し書いてありますね。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-5.html

No.11872

Re:recvfromによるメッセージ受信について
投稿者---Aqua(2004/01/16 20:06:18)


>UDPだと確実に送られる保証がないので、ロスがおきる可能性がありますね

なるほど、そうだったのですか。
TCPと同じようにデータが送られる事が保証されていると思っていました。
勉強不足でした・・

>送る際に1回ごとにちょっと間を置くようにしたらロスしなくなりました。
>(その分えらく遅くなりますが)

アドバイス通りに、nanosleepを使ってメッセージ送信後0.1秒ずつ止めるようにしたら
10000行分送信してもロスはなくなりました。
ですが、本当にやたらと遅くなってしまいますね。
送信し終えるまでに当然ですが15分以上かかってしまいました。

紹介して頂いたサイトにも、確実にデータを送りたいなら
TCPを使っとけって感じの事が書いてありましたし、
やはり無難にそうしておくのがいいのでしょうか。
独自にチェックするようにプログラムしても
UDPを使う以上はそれも確実なものではないというジレンマが・・・
もう少し足掻いてみて厳しそうならばTCPでいこうと思います。

ありがとうございました。