diff options
Diffstat (limited to 'src/common/net.c')
-rw-r--r-- | src/common/net.c | 57 |
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; + +} |