2010-12-30 6 views
2

を受け取るCソケットの質問に戻る。recvを使用して着信文字配列

クライアントからTCP経由でchar配列を受け取ろうとしています。

char buffer[2048]; 
int recvBytes = 0; 

while (1) { 

    if ((clntSockfd = accept(servSockfd, (struct sockaddr *) &clntAddr, &clntSockAddrLen)) == -1) { 
     printf("Unable to accept client connection\n"); 
    exit(1); 
} 
    else { 
     printf("Client connection accepted!\n"); 
    } 

    /* clear buffer */ 
    memset(buffer, 0, sizeof(buffer)); 

    recvBytes = recv (clntSockfd, buffer, sizeof(buffer), 0); 
    printf("Bytes received: %i\n", recvBytes); 
    printf("Char array received: %s\n", buffer); 
} 

私は実行時に、によりrecvbytesは最初の反復におけるゼロ示すことに注意:私は、次のRECVコードを有しています。 2番目の繰り返しの後で、それは着信char配列をピックアップします。

着信ソケットからデータを受信するまでrecvブロックを探していますか?バッファ内の不要な文字をどのように破棄するか、つまり、最初の繰り返しから受け取った文字を削除する必要があります。

多くの感謝!

- 編集---

こんにちはすべて、私は日食のコンソール出力を追加しました。

**... <- initialization stuff 
Binding socket to port 
Socket binded 
Start listening on port 8081. 
Client connection accepted!     *while loop - first iteration 
Bytes received: 0       *while loop - first iteration 
Char array received:       *while loop - first iteration 
Client connection accepted!     *while loop - second iteration 
Bytes received: 22       *while loop - second iteration 
Char array received: 1~Message~HowAreYou? *while loop - second iteration** 

上記のコンソール出力が、第1回目と第2回目の繰り返しについて私の質問を明確に示してくれることを願っています。上記から、最初の反復ではバイトは受信されませんが、recvはブロックされません。私はrecvがバイトを受け取るまでブロックすると思った?

+0

recvはバッファに文字がなくなるまでブロックします。返される値(recvBytes)はバッファ内の文字の数です。 – KevinDTimm

+0

@KevinDTimm: 'setsockopt'を使用してソケットを非ブロッキングモードにします。 –

+0

OPがより多くの情報を投稿すると、私たちはより良い回答を与えることができました(IOW、質問の質と同じです) – KevinDTimm

答えて

0

受信したデータに期待することが分かっている場合は、最初の文字セットを削除できます。たとえば、パケットの長さやメッセージのソースやヘッダー情報が分かっている場合は、最初の文字セットを検証して無視できます。

+0

ありがとう、私はそれをやろうとします。 – Poliquin

+0

ちょっとckv、最初の数文字がnull文字になる...最初のいくつかのnull文字を破棄しようとするのに問題があります。 – Poliquin

+0

OKメイト、それを持っています。 2つのwhileループでrecvを入れ子にしました。 – Poliquin

1

ソケットがブロッキングソケットの場合、recv関数はブロックされ、データを取得します。 recv関数は、ほとんどのシステムで相手側が接続を閉じるときにのみ0を返します。

コードと実行を再確認し、正確な出力をお知らせください。

詳細については、hereおよびhereを参照してください。

+0

申し訳ありませんが、私の答えに追加して誤って自分の編集を追加する文がありました。これで元に戻りましたが、それでも編集内容は記録されました。 –

+0

ベンでも問題ありません!実際に、私の答えに変更が必要だと感じたら、気軽に行ってください。 :) – Jay

+0

こんにちはジェイ!リンクありがとう!今読んでいる! – Poliquin

1

recvは、リモートエンドが(TCPなどのストリームソケットの場合)接続を閉じるか、ペイロードのないパケット(UDPなどのデータグラムソケット)が受信された場合にのみ0を返します。

ソケットはモード(デフォルトはブロックしている)、そして何のデータはまだはありません、あなたは、OSに依存しEAGAINまたはEWOULDBLOCKのいずれかを、エラーコードを取得したい非ブロッキングに設定されている場合。

いずれにしても、recvが返るたびに、新しいデータがバッファの先頭に格納されます。古いデータの後に新しいデータを格納するように設計されたポインタを計算しない限り、以前に受信したデータには追加されません。

+0

もう一度Ben Voight!ありがとう!私はいくつかのコードを試してみましょう – Poliquin

関連する問題