From 0525c3776e4c8c63e7a2604b0e21763c306ea114 Mon Sep 17 00:00:00 2001 From: northkillz Date: Thu, 17 Oct 2019 16:06:10 +0900 Subject: [PATCH] Handle fragmented data transmission * Resolve #25 --- mcrcon.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/mcrcon.c b/mcrcon.c index 62cd976..080f1e8 100644 --- a/mcrcon.c +++ b/mcrcon.c @@ -431,19 +431,18 @@ rc_packet *net_recv_packet(int sd) packet.size = psize; - ret = recv(sd, (char *) &packet + sizeof(int), psize, 0); - if (ret == 0) + int received = 0; + while (received < psize) { - fprintf(stderr, "Connection lost.\n"); - connection_alive = 0; - return NULL; - } + ret = recv(sd, (char *) &packet + sizeof(int) + received, psize - received, 0); + if (ret == 0) /* connection closed before completing receving */ + { + fprintf(stderr, "Connection lost.\n"); + connection_alive = 0; + return NULL; + } - if(ret != psize) - { - fprintf(stderr, "Warning: recv() return value (%d) does not match expected packet size (%d).\n", ret, psize); - net_clean_incoming(sd, DATA_BUFFSIZE); /* Should be enough. Needs some checking */ - return NULL; + received += ret; } return &packet;