summaryrefslogtreecommitdiff
path: root/src/common/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/net.c')
-rw-r--r--src/common/net.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/common/net.c b/src/common/net.c
index aba5ba2..b741883 100644
--- a/src/common/net.c
+++ b/src/common/net.c
@@ -24,6 +24,7 @@
#include "net.h"
+#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -100,3 +101,59 @@ int connect_via_tcp(const char *server, const char *port, struct sockaddr_in *ad
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : sock = nom ou adresse du serveur à contacter. *
+* buffer = tampon pour la réception des données. [OUT] *
+* max = taille prévue pour ce tampon. *
+* len = quantité de données effectivement reçues. [OUT] *
+* *
+* Description : Reçoit du réseau autant de données que possible. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool recv_all(int sock, char *buffer, size_t max, size_t *len)
+{
+ bool result; /* Bilan global à retourner */
+ ssize_t ret; /* Bilan d'un appel */
+
+ result = true;
+
+ buffer[0] = '\0';
+ max--; /* '\0' final */
+ *len = 0;
+
+ do
+ {
+ ret = recv(sock, buffer + *len, max, *len > 0 ? MSG_DONTWAIT : 0);
+
+ printf("ret = %zd\n", ret);
+
+ if (ret == -1 && *len == 0)
+ {
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ continue;
+ else
+ result = false;
+ }
+
+ else if (ret > 0)
+ {
+ max -= ret;
+ *len += ret;
+ }
+
+ }
+ while (ret > 0);
+
+ buffer[*len] = '\0';
+
+ return result;
+
+}