問題タブ [recvfrom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - Winsock でまれに sendto()/recvfrom() の問題が発生する理由は?
最近、次の症状を示すまれな UDP 通信の問題が確認されています。
- ソケット
sendto()
呼び出しがエラーWSAENOBUFS (10055)で失敗する - このソケットでの後続の
recvfrom()
呼び出しは、ネットワーク インターフェイスが予想されるデータグラムを実際に受信したことを Wireshark が示していても、何も受信しません。この状況は約 8 秒間持続し、その後、新しい受信データグラムをソケットから再度受信できます。 - Windows システム ログには、エラー発生
時のカーネル一般情報エントリが表示されます。
sendto()
The access history in hive \??\C:\ProgramData\Microsoft\Provisioning\Microsoft-Desktop-Provisioning-Sequence.dat was cleared updating 0 keys and creating 0 modified pages.
この問題は、Microsoft Windows 10 Pro for Workstations、バージョン 10.0.17763 ビルド 17763 を実行している顧客システムで発生します。
そのシステムでは、UDP データグラムをエコーする C++ で記述された単純なテスト プログラムで問題を再現することができました。ソケットから受信するスレッドが実際に常に応答していることを確認しましSO_RCVTIMEO
たrecvfrom()
。
独自のテスト システムでは、お客様と同じ状況で問題を確認できませんでした。ただし、テストの実行中にネットワーク アダプターの設定をいじると、同様の効果を引き起こすことができました。有効Microsoft LLDP Protocol Driver
にするとエラーがsendto()
表示され、8 秒間の「無音」期間が発生することもありましたが、Windows システム ログのエントリはありませんでした。
どんなヒントでも大歓迎です。
c - UDP ソケットからの recvfrom() メッセージを解析する際の予期しない動作
現在UDPソケットで作業していますが、次の状況を理解しようとして立ち往生しています。
受信バッファは次のように定義されています。
& は recvfrom() を呼び出すことで満たされます
Wireshark を使用して確認したリモートからこれらのデータを取得しています。
単純なfor
ループを使用してバッファの内容を特定すると、次のようになります。
確かに、受信したメッセージを取得/解析しようとして何か誤解していましたが、 buf[1]、buf[26]、buf[30]、buf[31]、および buf[32] を印刷すると余分な FF が返される理由を説明できません。
gdb を使用した場合と同じ動作
ヒントをいただければ幸いです。
c - recvfrom を使用して udp データを保存し、後で印刷するために構造を使用できない
次の構造体を使用して、受信したデータを入れようとしています:
これは印刷機能です。
私のメインでは、受信したデータを私の構造に保存するためにこれを試みています:
出力:
Magic、Version、Body Length は、パケットの先頭の予期される出力です。プロトコルの後に他のピアが続くため、パケットの最大サイズは 1024 バイトです。
ただし、displayPacket 関数、より正確には次の行によって引き起こされるセグメンテーション違反があります。
役立つ場合、これは valgrind の出力です。
それはかなり些細なことのように思えますが、何時間も私を悩ませてきました...
予想される出力は、パケット内の残りのコンテンツのコンテンツです。これまでのところ、私はそれを行うことができました。
この問題を解決するために考えられる解決策は何ですか?
ありがとう。
編集1:
次のように構造を変更して、セグメンテーション違反の問題を解決しました。
そして残りのコード:
displayPacket は変更されていません。