2016-11-20 12 views
0

アプリケーション層にクライアントとサーバーがあり、クライアントがランダムなペイロードサイズのサーバーにパケットを送信しています。つまり、あるパケットは1300バイト、次のパケットは450バイト、次のパケットは1449バイトとなります。サーバーから、クライアントから受信したペイロードデータをどのように読み取ることができますか?あなたのソケットはどれくらいのデータを読み込むべきですか?クライアントが送信しているペイロードサイズを送信できないという事実を考慮してください。サーバーは、1300,450、および1449バイトの個々のパケットをどのように区別できますか。私たちはCでPOSIXソケットを使い、アプリケーション層で作業しています。すべてのコードスニペットが役立ちます。パケットペイロードのバイト数はどのようにして計算できますか?

+0

どのプロトコルを使用していますか?私。 'socket'呼び出しの引数は何ですか? – pat

+1

'すべてのコードスニペットは役に立ちます'はい、まさに、私たちがあなたの問題を理解するのに役立ちます;-)真剣に、ここに適合するように質問を編集してください。 – kebs

+0

これはTCPまたはUDP用ですか?私はTCPを想定しています。「*クライアントは送信しているペイロードサイズを送信できません」と考えているのは、UDPでは問題ではなく、TCPだけです。クライアントがペイロードサイズを送信できないのはなぜですか? TCPでは、送信者がペイロードサイズまたは一意のメッセージ区切り文字を送信しない限り、メッセージの境界を区別する方法はありません。メッセージペイロードは実際にどのように見えるのですか? –

答えて

0

一般に、recv()には、予想される最大のデータグラムを保持するのに十分な大きさのバッファを発行するだけです。戻り値はデータグラムの実際のサイズを反映します。

POSIXでは、次のデータグラムのサイズをチェックする方法を指定していません。

ただし、LinuxおよびBSDシステムでは、一部のプロトコルでは、それ以外の場合は、読み込み可能なバイト数を返します。たとえば、UDP socketを使用している場合は、FIONREADioctl()を使用できます。ここに例があります:

#include <sys/socket.h> 
#include <sys/ioctl.h> 

size_t unread(const int socketfd) 
{ 
    int length = 0; 
    if (ioctl(socketfd, FIONREAD, &length)) 
     return 0; 
    if (length < 0) 
     return 0; 
    return (size_t)length; 
} 

もちろん、これは受信したデータがあるかどうかはわかりません。 1つは、ioctl()の直後に到着した可能性があります。また、ゼロ長のデータグラムを送信することも可能です。上記の関数はエラー(ソケットプロトコルがioctlをサポートしていない)と同様に(受信したデータグラムもゼロ長のデータグラムも受信しない)と、エラーの両方でゼロを返します。

関連する問題