1

私は単一のサーバークライアントプログラムを作成しましたが、質問したいのですが、32ビットと64ビットのオペレーティングシステム間でrecv()関数の動作に違いはありますか。

サーバーとクライアントの両方を64ビットラップトップで実行していて、すべてが正常に機能しているため、これを求めています。私はこの方法でrecv()を呼び出します。while((tmp = recv(client_sock,rec_msg,256,0))>0)たとえば、クライアントから送信する文字列が3つある場合、サーバー部分でwhileを3回入力し、正しい結果を出力します。

32ビットのDebianマシンでまったく同じプログラムを実行すると、何らかの理由で、たとえばクライアントから3つの文字列を送信すると、サーバー部分のwhileループに1回だけ入り、3つの文字列を1つとして受信するようです。

printステートメントを使用したところ、whileループに1回入り、すべてのバッファーを受信することがわかりました。ただし、クライアント部分では、whileループが予想どおりに3回入力され、3つの文字列が3つの異なる時間に送信されます。64ビットで正常に動作し、32ビットで動作しない理由を論理的に見つけることができません。そのため、この質問をしています。

あなたの時間とあなたの助けを前もって感謝します。

4

1 に答える 1

4

これがストリーム ソケットの場合、固有のメッセージ境界はなく、送受信されるメッセージ間に相関関係はありません。recv()メッセージの一部、メッセージ全体、または複数のメッセージを返す場合があります。保証されているのは、バイトが送信されたのと同じ順序で受信されることだけです。

表示されている違いは、おそらく 2 つのマシンの速度の違いによるものです。32 ビット マシンは低速であるため、ネットワーク上で利用可能なデータを確認するのにかかる時間内に、3 つのパケットすべてが到着します。しかし、より高速な 64 ビット マシンは、2 番目のパケットが到着する前に、最初のパケットから受信したデータを処理します。

于 2012-11-03T02:23:46.770 に答える