おせわになります。
socket関数(WinSock2)のrecv関数のことで質問なのですが、
第4引数にMSG_PEEKを指定したときと、指定しない時(=0)
の戻り値が、明らかに違うのです。
実際は、20000バイトを送信し、受信側でrecvすると、
MSG_PEEKを指定すると、8760が返り、
MSG_PEEKを指定しない(=0)と、20000が返ります。
(もっと試して、200000と10倍にしても一回で受信しました。)
recvが一度に受信できる容量のテストをしていたときに発見したのですが、こういうものなのでしょうか?
以上、よろしくおねがいします。
No.1
- 回答日時:
recvの関数リファレンスはご覧になりましたか?
また、MSG_PEEKの意味はお分かりでしょうか?
recvが返す値は、
実際に読み込んだバイト数、または、
関数失敗時SOCKET_ERROR(-1)、または
接続終了時の0
上記3つの値を返します。
MSG_PEEKは受信キューから読み込んだデータを
取り除かないことを意味します。
どのようなプログラムを書いて、どのような環境で
テストしているのか判りませんが、こういうものなのか?と
いわれても、実際の環境やプログラムのコードを提示しない限り、
それらに答えることは難しいでしょう。
>recvが一度に受信できる容量のテスト
そもそも、何故このテストをする必要があるのか不明ですが、
recvが一度に受信できるサイズについては、
ソケットオプションで変更することが可能ですし、
これらのサイズはOSが決めた最大値を超えることは無く、
また、実際にはどのような数値が帰ってきてもおかしくないので、
あまり意味は無いと思うのですが。。。
これらのサイズに依存するプログラムを書くよりも
どのようなサイズが帰ってきても、適切に処理するように
すべきだと思います。
この回答への補足
回答どうもありがとうございます。
recvの関数リファレンスはもちろん見ています。
質問の意図は、
【recv関数において、MSG_PEEKを指定したときとしないときで受信するバイト数が違うのはなぜか?】
ということです。
上記の疑問に対して、『こういうものなのか?』という記述をしました。
このテストはもう少し正確に言うと、
【ソケットオプションで変更した値が本当に信用できるのか?】
という意味です。
『もしかしたら、オプションで指定した容量内にもかかわらず、
recvで受信するときに2回以上に分けて受信する必要性がでてくることも可能性としてあるのだろうか?』
というテストです。
以上、よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
>『もしかしたら、オプションで指定した容量内にもかかわらず、
>recvで受信するときに2回以上に分けて受信する必要性がでてくることも可能性としてあるのだろうか?』
>というテストです。
可能性がある。
としてプログラムしておいたほうが良いかと。
MSG_PEEK自体アテにするつもりがないのでrecv()の戻り値使って処理してます。
送信側が20000バイトを1回のsend()で送っても、
受信側が1回のrecv()で20000バイト受信できる保証はないワケですし。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.ht …
とか。
# 使ったプロトコルがせいぜいPOP3程度だし。
# それでもrecv()の戻り値を正しく扱わなくて不具合出したことがある。
ありがとうございました。
そうすると、recvはブロッキングでなく使えってことですよねー。
戻り値をとろうとして、終了してたらブロキングしちゃいますからねー。
No.3
- 回答日時:
既にアドバイスがついていますが一応
>【recv関数において、MSG_PEEKを指定したときとしないときで
>受信するバイト数が違うのはなぜか?】
No2さんの参照先。。。
今回のサイズの違いはバグということでしょうかね。。。;
>『もしかしたら、オプションで指定した容量内にもかかわらず、
>recvで受信するときに2回以上に分けて受信する必要性が
>あるのだろうか?』
当然考えられます。
これらは通信の帯域によっても変わってくるものですし、
設定した値は最大の許容量であって、OSが、
許容しているサイズを全て使い切る保障が無い以上、
指定したサイズ未満の受信の場合を考慮しなければなりません。
>recvはブロッキングでなく使えってことですよねー。
サーバ関係のプログラムだと、マルチスレッドでワーカと、
ノンブロッキングというのがかなりデフォルトな感じな
気がするのですが、私だけですかね:-p
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- Visual Basic(VBA) Outlook VBAについて 1 2023/07/10 12:41
- 株式市場・株価 株の信用取引について 2 2022/08/16 14:52
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- UNIX・Linux Postfixでドコモメールに送信すると届くまで10分ぐらいかかる 6 2023/03/05 13:56
- PostgreSQL 数値が定期的にあらわれる文字列から、いくつめに出現した数値が指定して切り出したい 1 2023/06/08 13:12
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- 大学受験 たくさんの意見お待ちしております 私は今高校一年生で、偏差値64程の高校に通っています。今目指してい 7 2023/01/01 20:15
- 大学受験 たくさんの意見お待ちしております 私は今高校一年生で、偏差値64程の高校に通っています。今目指してい 1 2023/01/01 23:14
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ソケットのrecvの戻り値が0
C言語・C++・C#
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
recv関数の受信結果について
C言語・C++・C#
-
-
4
TCP/IP のパケットの分断と結合について
UNIX・Linux
-
5
Socket通信の0バイト受信について
Java
-
6
ソケットのクローズについて
C言語・C++・C#
-
7
ネットワーク切断を検出するには?
C言語・C++・C#
-
8
スレッドの安全な終了のさせ方
C言語・C++・C#
-
9
Winsockでの送受信についての質問
C言語・C++・C#
-
10
send-recvで複数データの送受信
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Outlookの「受信日時」「送信者...
-
シリアル通信時のデータ受信方法
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
VB2010で、シリアル通信の方法...
-
TCP/IPで受信エラー
-
「TCPは全二重可能」の意味
-
VC++ 2010 メッセージが文字化...
-
プログラムの実行時間計測方法...
-
Excxel vba でYahoo API で住所...
-
C#にてCTI。RS232Cの受信と送信...
-
無線LAN、SIFSについて
-
パソコンに詳しい方教えて下さ...
-
Windows上のファイル操作の履歴...
-
バッチファイルでディレクトリ...
-
ipadで社内ネットワークに接続
-
FTPサーバにアップロードできない
-
指定ファイルをFTPで自動アップ...
-
システムファイルと工場出荷状態
-
cronからtarで圧縮しようとする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
Outlookの「受信日時」「送信者...
-
CRC-CCITTに関しての仕様とサン...
-
シリアル通信時のデータ受信方法
-
Excxel vba でYahoo API で住所...
-
UDP受信時の通信異常検知について
-
recv関数の戻り値について
-
ASP.NET C#でPOST受信
-
RS232cを用いた送信プログラム
-
VC++メッセージの送受信につい...
-
PC98で232c送信winndowで受信で...
-
TCPのプログラミングで質問…と...
-
VBのMSCommコントロールを使っ...
-
「TCPは全二重可能」の意味
-
DHCPOFFERの受信について
-
VB2010で、シリアル通信の方法...
-
msgrcv( )で領域破壊?
-
シリアル通信
-
ネットワークでの受信バイト数
おすすめ情報