C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WinSockソケット通信で受信データ長を調べたい


(過去ログ 91 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■54331 / inTopicNo.1)  WinSockソケット通信で受信データ長を調べたい
  
□投稿者/ ホエホエ (19回)-(2010/10/14(Thu) 00:22:05)

分類:[ネットワーク全般] 

いつもお世話になっております、ホエホエです。

下記にてMFC CSocket通信を使用しておりました。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=53983

がご指摘もあり実際に色々と不都合が出てきましたので
WinSock APIにてソケット通信プログラムを作成しております。
また元々は非同期にて受信イベント発生時に受信処理を
してましたが色々都合が悪くなり別スレッド上にて同期で
処理をすることとなりました。

別スレッドなので受信待機するのは問題ないのですが
永久に待つのはマズいのでselect関数でタイムアウトを
実装しましたが、実際何バイト受信すれば良いか分からず
バッファ長分recv関数で受信しようとすると結局は
そのバイト長まで受信データが来るまで待機してしまいます。

そこで先に何バイト受信したか分かればその分だけ
recv関数で受信すれば良いと思うのですが、どうすれば
受信データバイト長を取得できるのでしょうか?

ご存知の方、教えてください。
引用返信 編集キー/
■54333 / inTopicNo.2)  Re[1]: WinSockソケット通信で受信データ長を調べたい
□投稿者/ 甕星 (19回)-(2010/10/14(Thu) 07:25:15)
Socketにはノンブロッキングモードと、ブロッキングモードがあり、ノンブロッキングモードにすれば指定したサイズに満たなくても受信したデータを取り出せますので問題が解決するでしょう。
引用返信 編集キー/
■54353 / inTopicNo.3)  Re[1]: WinSockソケット通信で受信データ長を調べたい
□投稿者/ .SHO (1371回)-(2010/10/14(Thu) 13:47:12)
No54331 (ホエホエ さん) に返信

送信データの最初に何バイト送信するかを指定して
データを送信するようにインターフェースを設計し
直すしかないです。

引用返信 編集キー/
■54363 / inTopicNo.4)  Re[2]: WinSockソケット通信で受信データ長を調べたい
□投稿者/ ホエホエ (20回)-(2010/10/15(Fri) 09:02:41)
甕星さん>
selectとノンブロッキングモードの組み合わせで指定バイト数タイムアウト付きの受信処理が
できました。ありがとうございます。

.SHOさん>
送信側はある条件下になると可変長のメッセージを送ってきてメッセージのヘッダ部に
ヘッダ以降のデータ長が入ってると言う仕様でして…
解決済み
引用返信 編集キー/
■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と非ブロッキングです。
引用返信 編集キー/
■54409 / inTopicNo.6)  Re[4]: WinSockソケット通信で受信データ長を調べたい
□投稿者/ ホエホエ (22回)-(2010/10/19(Tue) 09:44:09)
れいさん>
返信が遅れてしまって申し訳ありませんでした。ご返信ありがとうございます。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=54364
にある通り一定間隔で受信したいと言うのが目的だったのですが
同期、非同期の問題ではなくTCPプロトコルの問題のようですね。

ご丁寧な忠告でかなり分かり易いです。ホント、感謝します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -