commit d97a639db1807cdb6b8af1e76e39b00dcccd7a8c
parent e63ea4d463bfcb9e30a388f65c97afc2a275b2d2
Author: Yersa Nordman <yersa@finwo.nl>
Date: Fri, 17 Nov 2023 00:24:00 +0100
Keep reading during recv while hitting limits
Diffstat:
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/fnet.c b/src/fnet.c
@@ -441,6 +441,9 @@ FNET_RETURNCODE fnet_process(const struct fnet_t *connection) {
struct buf *rbuf = NULL;
struct epoll_event *epev;
+ char *tmp_buf = NULL;
+ int tmp_n = 0;
+
// Checking arguments are given
if (!conn) {
fprintf(stderr, "fnet_process: connection argument is required\n");
@@ -460,22 +463,28 @@ FNET_RETURNCODE fnet_process(const struct fnet_t *connection) {
if (conn->ext.status & FNET_STATUS_CONNECTED) {
rbuf = malloc(sizeof(struct buf));
-
-
- // BORKED ON WINDOWS (512), DOESN'T GET THE WHOLE MESSAGE
+ tmp_buf = malloc(BUFSIZ);
rbuf->data = malloc(BUFSIZ);
rbuf->cap = BUFSIZ;
for ( i = 0 ; i < conn->nfds ; i++ ) {
- n = recv(conn->fds[i], rbuf->data, rbuf->cap, 0);
- printf("Received %d bytes\n", n);
- if (n < 0) {
+
+ rbuf->len = 0;
+ do {
+ tmp_n = recv(conn->fds[i], tmp_buf, BUFSIZ, 0);
+ buf_append(rbuf, tmp_buf, tmp_n);
+ } while(tmp_n == BUFSIZ);
+
+ printf("Received %d bytes\n", rbuf->len);
+
+ if (rbuf->len < 0) {
if (errno == EAGAIN) continue;
buf_clear(rbuf);
free(rbuf);
+ free(tmp_buf);
return FNET_RETURNCODE_ERRNO;
}
- rbuf->len = n;
+
if (rbuf->len == 0) {
fnet_close((struct fnet_t *)conn);
break;
@@ -492,6 +501,7 @@ FNET_RETURNCODE fnet_process(const struct fnet_t *connection) {
buf_clear(rbuf);
free(rbuf);
+ free(tmp_buf);
return FNET_RETURNCODE_OK;
}