2009-03-07 11 views
1

ソケットに関する質問があります。Cのソケットから受け取った文字列データを比較する

while(bytes = recv(sClient, cClientMessage, 599, 0)){ 

これは、それがcClientMessageにrecivesメッセージを置き、メッセージは常に「メッセージ」である:私はこのコードを持っています。どのように私はif(cClientMessage == "Message"){//do func}のようなifステートメントを作った。今、このコードは私が望む機能をしません。私はこれがメッセージの権利を受け取っていないからだと思う。誰か助けてくれますか?そこにソケットエラーであり、あなたのコードは無限ループにつながる場合にrecvが非ゼロを返しますので、

while(bytes = recv(sClient, cClientMessage, 599, 0)){ 

これは間違っている:

+0

これがなぜ投票されたのか分かりません。 –

+0

受け入れられた解決策にはいくつかのバグがあり、そこにはいくつかのバグがありません。元の質問には現れません。以下の私の解決策を見てください。 (例:「Message5」を受け取った場合、それは一致してはならないことも分かります)。 –

答えて

4

試してみてください。

if(strcmp(cClientMessage, "Message")) == 0) { 
    // do something 
} 

編集は、stragerからの提案以下:

if(memcmp(cClientMessage, "Message", strlen("Message"))) == 0) { 
    // do something 
} 

受信したデータがNULL終端さに依存しないよりよい解決策は、memcmpを使用することです

+0

\ 0が存在しない場合、私はもっとmemcpyを考えていますが、これはうまくいくと思います。 – strager

+0

(私は誰がこれをしたのだろう...) – strager

+0

memcmpではなくmemcpyと思う? –

2

まずあなたが書いたコードにバグがあります。特に、あなたは何をしたかと> 0

char cClientMessage[599]; 
while((bytes = recv(sClient, cClientMessage, sizeof(cClientMessage), 0)) > 0) 
{ 
    if(strlen("Message") == bytes && !strncmp("Message", cClientMessage, bytes)) 
    { 
    //cClientMesssage contains "Message" 
    } 
} 

if(bytes == 0) 
{ 
    //socket was gracefully closed 
} 
else if(bytes < 0) 
{ 
    //socket error occurred 
} 

問題をチェックしたい:cClientMessageを==「メッセージ」であることを、あなたは文字列リテラルへのchar *を比較した場合、または文字列へのchar []リテラルの場合、実際の内容ではなくポインタのアドレスを比較します。

+0

memsetは無駄です。ちょうどcClientMessage [bytes] = 0;バイトは常にrecvのパラメータに基づいて0〜598の範囲です。 – jmucchiello

+0

strcmpの代わりにstrncmpを使用する必要があります。また、メッセージが8文字未満であるかどうかを確認していないので、4バイトの "Mess"を受け取った場合や、バッファがすでに "age \ 0"になっている場合は誤検出が発生する可能性があります。 –

+0

ありがとうございましたadam私もそれを世話しました –