Я пишу http-сервер с TCP-сокетами на C. По какой-то причине я получаю частичные данные, даже если я вызываю read
в таком цикле, как это.
size_t data_len = 0;
while (auto len = read(sock, buf + data_len, read_buffer_size)) {
if (len < 0) {
if(errno == EWOULDBLOCK) {
break;
}
}
data_len += len;
}
Используемые опции сокетов:
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void *) &new_buf_size, sizeof(new_buf_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *) &new_buf_size, sizeof(new_buf_size));
setsockopt(sock, SOL_SOCKET, SO_DONTROUTE, (void *) &turn_on, sizeof(turn_on));
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *) &turn_on, sizeof(turn_on));
setsockopt(sock, SOL_SOCKET, SOCK_NONBLOCK, (void *) &turn_on, sizeof(turn_on));
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
Есть идеи, что я делаю не так?