Bonjours la communauté.
En plein projet de crée mon propre serveur dns lié à postgres.
je m'amuse avec les socket udp.
tous marche comme prévue.
juste une question.
Ne puis-je pas faire appelle à deux fois d'affilé à la
fonction recvfrom.
j'ai lut dans le man que udp->dest_size était une variable retour.Code:n = recvfrom(*udp->sock, &octet, sizeof octet, 0, (SOCKADDR *)udp->dest, (socklen_t *)&udp->dest_size);
donc je n'oublie pas de réinitialiser.
aucune variable varie à part "octet" en vue pas à pas.
alors je ne comprend pas trop.
quand je fait un appelle avec un octet qui vaut :
tous fonctionne dans le meilleur des mondes.Code:char octet[1024];
je reçois mon bloque de centaines d'octet d'un coup.
mais ici je voudrais le faire fonctionner octet par octet.
histoire de pousser dans un buffer mes octet.
hors lors de mon deuxième appelle à recvfrom
pouf je n'ai plus rien.
enfin voici mon code final si cela interresse de ma fonction:
qui malheureusement ne fonctionne qu'ainsi :Code:
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 char darkdns_socket_udp_receive(Udp *udp,androBuffer *buffer) { char octet; char bValid=0; int n=0; if (!udp || !buffer) fprintf(stderr,"darkdns_socket_udp_send no udp or no buffer"); else { do { printf("go one octet\n"); udp->dest_size=sizeof(*udp->dest); n = recvfrom(*udp->sock, &octet, sizeof octet, 0, (SOCKADDR *)udp->dest, (socklen_t *)&udp->dest_size); if (n>0) { buffer->write(buffer,&octet,n); } }while(n>0); if(n<0) fprintf(stderr,"recvfrom()"); else bValid=1; } return bValid; }
Code:
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 char darkdns_socket_udp_receive(Udp *udp,androBuffer *buffer) { char octet[1024]; char bValid=0; int n=0; if (!udp || !buffer) fprintf(stderr,"darkdns_socket_udp_send no udp or no buffer"); else { //do { //printf("go one octet\n"); udp->dest_size=sizeof(*udp->dest); n = recvfrom(*udp->sock, &octet, sizeof octet, 0, (SOCKADDR *)udp->dest, (socklen_t *)&udp->dest_size); if (n>0) { buffer->write(buffer,&octet,n); } //}while(n>0); if(n<0) fprintf(stderr,"recvfrom()"); else bValid=1; } return bValid; }