1

recvfrom()呼び出しを待機しているスレッドがブロック解除されてエラーで戻るようにする「良い」方法はありますか?

この動機は、UDPデータグラムを読み取るユニットを含むシステムのユニットテストを作成することです。ブランチの1つは、recvfrom呼び出し自体のエラーを処理します。コードは、さまざまなタイプのエラーを区別する必要はなく、フラグを設定するだけです。

別のスレッドからソケットを閉じるか、ソケットをシャットダウンして、recvfromがエラーで返されるようにすることを考えましたが、これは少し手間がかかるようです。特大のパケットを送信することでそれが可能であるという言及を他の場所で見たので、16Kバッファが4Kだけを待っているrecvfromに送信される実験を設定しましたが、エラーにはなりませんでした。recvfromは4096を返すだけで、そのバイト数を取得したことを示します。

4

5 に答える 5

2

#includeテストしているクラスがアプリケーションの他の部分から十分に分離されている場合は、単体テストから.cソースファイルをホールセールすることができます。次に、マクロを使用して#define recvfrom(...)、テスト内でのみ独自のプライベート関数を実行できます。

これにより、プライベート実装が単体テストにさらされることに注意してください。それでも、パブリックインターフェイスに対してテストし、内臓が見えないふりをする必要があります。かなりハッキーですが、少なくとも、成果物のコードを中断することなく、単体テストの醜さをすべて含んでいます。

于 2010-05-23T04:52:23.670 に答える
1

ネットワークライブラリの周りにクラスを作成し、いくつかの基準に基づいて失敗する場合があります。たとえば、特定の周波数でエラーをエミュレートする特定のネットワークパフォーマンスレベルに基づいて、このネットワーク層に障害が発生する可能性があります。

私は過去に同様の質問をしましたが、それも役立つかもしれません。

于 2010-05-22T02:29:52.223 に答える
0

やや手間のかかる、またはトリッキーなアプローチがおそらく必要だと思います。

を使用ioctl(sock, FIONBIO,してソケットを非ブロッキングモードに切り替えてみましたか?

于 2010-05-22T02:48:42.653 に答える
0

最も簡単なのはおそらくシグナルを送信することですが、それは元のコードにハンドラーが設定されているかどうかによって異なります。

于 2010-05-22T02:51:57.537 に答える
0

これをCで行ったことはありませんが、C#/ Javaでは、Sockets、TCPClientなどのラッパークラスを作成します。各ラッパークラスは、使用したいメソッドを表すインターフェイスを実装します。これにより、依存性注入パターンを使用して、モックまたはスタブされたソケットを注入できます。おそらくこのパターンが役立つかもしれませんが、あなたは自分の言語に翻訳する必要があります。

于 2010-05-22T09:40:45.983 に答える