Проблема этой реализации заключается в том, что всякий раз, когда длина полученного ввода равна кратен максимальному размеру буфера, заданному функции Recv(), цикл всегда ждет следующего отправленного сообщения.
Функция получателя следующая:
Код: Выделить всё
static void do_recv(int fd) {
char rbuf[MAX_RECV_BUFFER_SIZE] = {0};
int n = -1;
while (1) {
n = recv(fd, rbuf, sizeof(rbuf), MSG_DONTWAIT);
if (n > 0) {
// each client when the connection is accepted gets a NULL buffer to recieve their data
extend_rbuf(fd, rbuf, n, sizeof(rbuf));
std::cout size = client_rbuf->len + rlen + 1;
char *new_rbuf = (char *)realloc(client_rbuf->buf, client_rbuf->size * sizeof(char));
if (!new_rbuf) {
perror("realloc new_rbuf: out of memory");
}
client_rbuf->buf = new_rbuf;
memcpy(client_rbuf->buf + client_rbuf->len, data, rlen);
client_rbuf->len += rlen;
}
return 0;
}
Код: Выделить всё
if (n == sizeof(rbuf)) {
continue;
}
Код: Выделить всё
bytes read: 2 current read: 12
size: 3 len: 2
bytes read: 2 current read: 3
size: 5 len: 4
bytes read: 1 current read:
size: 6 len: 5
read ended here, read from client
123
Код: Выделить всё
bytes read: 2 current read: 12
size: 3 len: 2
bytes read: 2 current read: 34
size: 5 len: 4
bytes read: 2 current read:
size: 7 len: 6
Код: Выделить всё
bytes read: 2 current read: o
size: 9 len: 8
bytes read: 1 current read:
size: 10 len: 9
read ended here, read from client
1234 # 1234 shows up here now
o
Подробнее здесь: https://stackoverflow.com/questions/790 ... uffer-size
Мобильная версия