■54379 / inTopicNo.5) |
Re[3]: WinSockソケット通信で受信データ長を調べたい |
□投稿者/ れい (966回)-(2010/10/16(Sat) 07:05:55)
|
????
皆さんが何を言っているのかよくわかりません。
■No54331 (ホエホエ さん) に返信 > 別スレッドなので受信待機するのは問題ないのですが > 永久に待つのはマズいのでselect関数でタイムアウトを > 実装しましたが、実際何バイト受信すれば良いか分からず
SO_SNDTIMEOやSO_RCVTIMEOで送受信のタイムアウトを指定できます。 (が、これはお勧めしません)
> バッファ長分recv関数で受信しようとすると結局は > そのバイト長まで受信データが来るまで待機してしまいます。
ブロッキングのrecvはバッファ長分受信するまで待機するわけではありません。 何もデータが無いときに待機します。 バッファ長以下のデータでも、戻ります。
selectが成功で戻った際に、 recvを呼べば、現在までに届いたデータすべてが取得できます。
■No54333 (甕星 さん) に返信 > Socketにはノンブロッキングモードと、ブロッキングモードがあり、ノンブロッキングモードにすれば指定したサイズに満たなくても受信したデータを取り出せますので問題が解決するでしょう。
上記のように、データが届いていればブロッキングでも、ノンブロッキングでも受信した分だけのデータを取り出せます。
■No54353 (.SHO さん) に返信 > 送信データの最初に何バイト送信するかを指定して > データを送信するようにインターフェースを設計し > 直すしかないです。
いいえ。 バッファに貯めるなりなんなりで処理できます。
■No54363 (ホエホエ さん) に返信 > selectとノンブロッキングモードの組み合わせで指定バイト数タイムアウト付きの受信処理が > できました。ありがとうございます。
socketを使う方法はいろいろありますが、 スレッドを用いて非ブロッキングでselectを用いる、というのはかなりの無駄があります。 スレッドが必須ならブロッキングでタイムアウト付きselectが楽です。
socketが一つでいいクライアントアプリケーションなら、 おそらく一番楽なのはWM_TIMERとselect+ブロッキングか、WM_TIMERと非ブロッキングです。
|
|