6


C++のソケットを使用してUDPメッセージを受信しようとしています。
ヘッダーでメッセージのサイズを送信しているので、どのくらいのメモリを割り当てる必要があるかを知ることができるので、次のようにメッセージの始まりを覗いてみます。

int bytesRead = recvfrom(m_socketId, (char*)&header, Message::HeaderSize, MSG_PEEK, (struct sockaddr *)&fromAddr, &addrSize);  

しかし、私はシステムエラー10040を受け取り続けます:

「データグラムソケットで送信されたメッセージが、内部メッセージバッファまたはその他のネットワーク制限よりも大きいか、データグラムの受信に使用されるバッファがデータグラム自体よりも小さかった。」

メッセージの物乞いだけを覗く方法はありますか?
ありがとう :)

4

3 に答える 3

6

UDPパケットの最大サイズがであるとする65507、すべての呼び出しに単一の64kの「バウンスバッファ」を割り当てることができrecvfrom()ます。コピーした後、サイズを読み取り、新しいバッファを割り当てて、正確に正しいサイズのパケット。

パケットデータを大量にコピーするのは少し無駄ですが、適切なサイズでバッファを割り当てることができます。

または、アプリケーションのアーキテクチャが原因でピアが8kを超えるパケットを生成しないことがわかっている場合は、8kのバッファを割り当てて、スペースを浪費することができます。メモリの使用を意識することは重要ですが、余分なページを書き込むだけでコードが単純になる場合があります。

于 2011-04-02T06:34:21.377 に答える
3

あなたは試すことができWSARecvMsg(..., MSG_PEEK)ます。結果にフラグが設定されますがMSG_TRUNC、要求したヘッダー バイトも必要です。

于 2011-04-02T06:41:55.380 に答える
0

あなたのコードは実際には完全に問題ありません。recvfromのページにあるエラー コードWSAEMSGSIZE(これはあなたのものです) の説明を読んでおく必要があります。10040

メッセージが大きすぎて、buf パラメーターが指すバッファーに収まらず、切り捨てられました。

あなたの場合、エラー コードWSAEMSGSIZEは実際にはエラーではありません。これは、意図的に完全なパケットよりも少ない読み取りを行っているためです。MSG_PEEK入力キューからパケットを削除せずに、ヘッダーを解析して完全なパケットを読み取るだけです。

于 2015-02-17T09:54:29.853 に答える