アプリケーション層にクライアントとサーバーがあり、クライアントがランダムなペイロードサイズのサーバーにパケットを送信しています。つまり、あるパケットは1300バイト、次のパケットは450バイト、次のパケットは1449バイトとなります。サーバーから、クライアントから受信したペイロードデータをどのように読み取ることができますか?あなたのソケットはどれくらいのデータを読み込むべきですか?クライアントが送信しているペイロードサイズを送信できないという事実を考慮してください。サーバーは、1300,450、および1449バイトの個々のパケットをどのように区別できますか。私たちはCでPOSIXソケットを使い、アプリケーション層で作業しています。すべてのコードスニペットが役立ちます。パケットペイロードのバイト数はどのようにして計算できますか?
0
A
答えて
0
一般に、recv()
には、予想される最大のデータグラムを保持するのに十分な大きさのバッファを発行するだけです。戻り値はデータグラムの実際のサイズを反映します。
POSIXでは、次のデータグラムのサイズをチェックする方法を指定していません。
ただし、LinuxおよびBSDシステムでは、一部のプロトコルでは、それ以外の場合は、読み込み可能なバイト数を返します。たとえば、UDP socketを使用している場合は、FIONREAD
ioctl()
を使用できます。ここに例があります:
#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をサポートしていない)と同様に(受信したデータグラムもゼロ長のデータグラムも受信しない)と、エラーの両方でゼロを返します。
関連する問題
- 1. ファイルごとのコピーオーバーヘッドはどのようにして計算できますか?
- 2. 2 datetime pickerはどのようにして計算できますか?
- 3. どのようにしてOdooの計算フィールドで検索できますか?
- 4. SharePoint計算フィールドの数値が10進数か整数かをどのように計算しますか?
- 5. STAN計算の時間スケールと反復回数はどのようにして計算されますか?
- 6. Makefile変数はどのようにして計算されますか?
- 7. 合計はどのように計算できますか? dataGridView列の値のうちどれですか?
- 8. エリクサーでのクエリ結果の合計はどのようにして計算できますか?
- 9. 2つの日付間の年数はどのようにして計算できますか?
- 10. 固定幅のUILabelの行数はどのようにして計算できますか?
- 11. 階層テーブルの子値の合計はどのようにして計算できますか?
- 12. Luceneはマルチフィールドスコアをどのように計算しますか?
- 13. trec evalはどのようにMAPを計算しますか?
- 14. この16進数計算はどのように機能しますか?
- 15. Fabric Answersでsession_lengthをどのように計算しますか?
- 16. クリックスクロール量はどのようにしてwinformsスクロールバーで計算されますか?
- 17. C#のUdpClient.Send()データグラムのバイト数の計算
- 18. パンダはどのようにしてインデックスを計算しますか?
- 19. 最適な列幅はどのように計算できますか?
- 20. こちらMapview:ズームレベルはどのように計算できますか?
- 21. バイト配列はどのように操作して作成できますか?
- 22. アプリケーションフットプリントとはどのように計算するのですか?
- 23. どのように累積パーセントを計算しますか?
- 24. サロゲートペアはどのように計算されますか?
- 25. CSSグラジエントパスはどのように計算されますか?
- 26. emはどのように計算されますか?
- 27. 階乗はどのように計算されますか?
- 28. UIScrollView - showsHorizontalScrollIndicatorはどのように計算されますか?
- 29. カフカオフセット値はどのように計算されますか?
- 30. gitハッシュはどのように計算されますか?
どのプロトコルを使用していますか?私。 'socket'呼び出しの引数は何ですか? – pat
'すべてのコードスニペットは役に立ちます'はい、まさに、私たちがあなたの問題を理解するのに役立ちます;-)真剣に、ここに適合するように質問を編集してください。 – kebs
これはTCPまたはUDP用ですか?私はTCPを想定しています。「*クライアントは送信しているペイロードサイズを送信できません」と考えているのは、UDPでは問題ではなく、TCPだけです。クライアントがペイロードサイズを送信できないのはなぜですか? TCPでは、送信者がペイロードサイズまたは一意のメッセージ区切り文字を送信しない限り、メッセージの境界を区別する方法はありません。メッセージペイロードは実際にどのように見えるのですか? –