Bonjour a tous (ca faisais longtemps),
j'ai une fonction qui lis les données sur un socket TCP, lis la taille, enregistre les données dans un buffer ... cette fonction fonctionne bien lorsqu'il n'y a pas de grosses données a traiter (<1Ko) . mon client postgreSQL fonctionne bien lorsqu'il y a des trames < 1ko (environ hein), mais lors de nombreux resultats que me renvoient mon serveur, ca plante ! j'ai trouvé la source du bug (difficilement), mes sockets ne sont pas bloquantes et lors d'un recv, ma fonction ne me renvoie pas toutes mes données :
example : lors ce que j'attend 1820 octets (taille de ma trame TCP pour une cinquantaine de resultats renvoyés par mon serveur), la fonction recv me renvoie que 1460 octets. si je temporise le traitement (breakpoint), cette fonction recv me lis 1820 octets et mon client ne plante pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 enum net_socket_error net_socket_recv_tcp ( int net_socket, void * restrict buf, unsigned int * len ) { ssize_t received; if (check(net_socket != -1, "Argument net_socket is invalid") && check(buf != NULL, "Argument buf is NULL") && check(len != NULL && *len > 0, "Argument len is NULL")) { received = recv(net_socket, buf, *len, 0); if (received >= 0) { *len = (unsigned int)received; return ((received > 0) ? NET_SOCKET_OK : NET_SOCKET_ERROR); } *len = 0; if (net_socket_errno() == EWOULDBLOCK) { return NET_SOCKET_WOULD_BLOCK; } else { trace_errno(); } } return NET_SOCKET_ERROR; }
une solution a mon probleme ? merci d'avance !
Partager