Возможно, вы достигли лимита буфера ядра.Вероятно, вы можете увеличить SO_RCVBUF на приемнике, и он будет работать так, как вы ожидаете: SIOCINQ в конечном итоге вернет полный размер непрочитанных данных.
Но вы не должны этого делать для обеспечения надлежащего функционирования.связываться с буферами следует только тогда, когда вы хотите настроить производительность.
Вы должны реструктурировать код так, чтобы вам никогда не приходилось спрашивать ядро, сколько байтов доступно.Просто прочитайте до разумного предела (например, 4096) и разберитесь с одним сообщением уровня приложения, разбитым на несколько частей.Если вам нужны длины / границы сообщений, вы ДОЛЖНЫ реализовать их самостоятельно поверх 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.