ここから本文です

c言語のselect()に関して。

アバター

ID非公開さん

2019/5/311:07:32

c言語のselect()に関して。

サーバーとクライアントのチャットシステムを作っています。

クライアント側からwrite()でメッセージを送る際に、メッセージの最後に改行をつけてから送信するのですが、改行のつけ方によってサーバー側の挙動が変わってしまいます。

改行のつけ方によっては、read()した後に、なぜかもう一周select()を突破してしまう(つまり、一回しかwrite()をしていないのに二回select()を抜けてしまう)のです。

サーバー側でどのようにread()したらこれを防ぐことができるか教えていただきたいです。

閲覧数:
23
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

2019/5/311:21:37

UDPですか?

もしTCPならそもそもwriteの回数とselectを抜ける回数を関連付けちゃうほうが間違ってないかしら? TCPの場合データの通信単位は「バイト」ですから。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/lame-list.html の20を参照。
#どうでもいいけど、リムネットってまだ生きてるのか...

  • アバター

    質問者

    ID非公開さん

    2019/5/312:08:08

    TCPです。

    クライアント側のwrite()は、接続要求が受理された時に、ユーザー名を送信する時に使っています。

    サーバー側では、無限ループでセレクト文を常に監視しているのですが、ユーザー名をread()して登録した後に、そのユーザーからチャットの文章が送られてきていないのにもかかわらず、一回だけ、送られてきたとみなしてしまいます。(ユーザー名後ろに改行をつけるやり方で正しく動いたり動かなかったりします)

    通信単位はバイトであっていました。

    わかりにくい質問ですいません。

  • その他の返信(3件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

アバター

質問した人からのコメント

2019/5/3 13:51:25

大変詳しい解答、ありがとうございました。

大変助かりました。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる