ここでは簡単な背景があります:私は、クライアントとサーバープログラムがUNIXソケットを介してお互いに通信しています。受信したメッセージをサーバー側で解析するときに、strncmpを使用して実行するアクションを特定しようとしています。strncmpの適切な使用
私が抱えている問題は、strncmpの長さ引数に使用するものを正確に把握することです。これが問題になっている理由は、私のメッセージのいくつかが共通のプレフィックスを共有しているからです。たとえば、サーバーにプライマリ・サーバー・アドレスで応答するメッセージ「getPrimary」と、サーバーがプライマリ・サーバーのステータスで応答する「getPrimaryStatus」というメッセージがあります。私の最初の考えは次の操作を実行することでした。
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
return foo;
}
else if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
}
これに伴う問題は、私はサーバー「getPrimaryStatus」を送信するときにstrncmpは、文字列に十分チェックされていないため、コードは常にFOOを返しますです。私はstrncmpの長さ引数としてstrlen(message)を渡すことができましたが、予期しない入力の場合にオーバーフローを防ぐstrncmpの使用目的を無効にするようです。私は読むことができる最大メッセージ長のための静的変数を持っていますが、長さがメッセージのオーバーフローがエフェクトが最小化されていることを確認しているので、これを渡すように思えます。
私はいくつかの解決策を考え出しましたが、それほどきれいではないので、この問題に対処する共通の方法があるかどうかは疑問でした。
参考までに私の現在の解決策は次のとおりです:共通の接頭辞を持つメッセージが長さの降順でチェックされるように、if/else if文を注文します(これは地雷を投げる本当に良い方法のようです後で何かを追加しようとしている人のために私のコードに書いておいてください)。
グループでは、私の共通の接頭辞を持つメッセージを一緒に最初の接尾辞を探します。
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
else
return foo;
}
}
をしかし、これはちょうど私が私が扱うよ約20の異なる可能なメッセージを持っている、特に以来、汚い感じています。
私が持っているすべてのメッセージの配列を作成し、長さを降順に並べ替える関数をinitシーケンスに追加し、マッチするものが見つかるまでそのリストの要素を検索します。これは複雑で愚かなようです。
これは、どこかに解決策があるはずの共通の問題であるはずですが、これまで何も見つけられていないようです。
ありがとうございました!
これは最も簡単な解決策です。これは実際にはプロセス間通信を容易にするためにUnixソケットを使用して初めてのことですが、私は2ヶ月前にソケット処理コードを書いていました...私は読み込みバイト数を返すread()を使っていたことを完全に忘れてしまいました! –
代わりに、メッセージサイズをstrncmpに渡すことは、あなたの問題に対する不完全な解決策だと思います。詳細は私のソリューションをご覧ください。 –
多くの一致する文字を含む文字列間の比較は、「チャンク」手法を使用して最も効率的に実行できますが、早い時期に異なる文字列間の比較は文字単位のアプローチを使用する方が効率的です。 "n"が大きいときにstrncmpの実装がチャンクを使用すると、驚くことはありませんが、可能性のあるユースケースとそうでない場所の別々の機能があると良いでしょう。 – supercat