おそらくカーネルバッファの上限に達しています。あなたはおそらくSO_RCVBUFを受信機で増やすことができ、期待どおりに動作します:SIOCINQは最終的に未読データのフルサイズを返します。
しかし、正しく機能するようにするべきではありません。バッファを混乱させるのは、パフォーマンスを微調整したいときだけです。
カーネルに使用可能なバイト数を尋ねる必要がないように、コードを再構成する必要があります。合理的な制限(4096など)を読み、1つのアプリケーションレベルのメッセージを複数の部分に分割して処理します。メッセージの長さ/境界が必要な場合は、TCPの上に自分自身を実装する必要があります。
ここで長ヘッダーとメッセージを読むためにいくつかの愚かなコードです。
int ret, len = 0, have_read;
have_read = 0;
while (have_read < sizeof(len)) {
// This will likely always return sizeof(len) the first time.
ret = read(fd, ((char*)&len) + have_read, sizeof(len) - have_read);
if (ret <= 0) {
// Handle error.
}
have_read += ret;
}
char* buf = malloc(len);
if (!buf) {
// Handle error.
}
have_read = 0;
while (have_read < len) {
ret = read(fd, buf + have_read, len - have_read);
if (ret <= 0) {
// Handle error.
}
have_read += ret;
}
// Handle message in buf.
UDP、TCPまたはその他のソケット?また、ioctl()を使用して文字を取得することもできます。これはp2が16385バイトだけを識別する方法ですか? – Jake
@Jake:ソケットの作成にはSOCK_STREAMを使用します。 p1は16388を送信しますが、ioctl()は16385だけを見るので、混乱しています。 –