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.
n = recvfrom(*udp->sock, &octet, sizeof octet, 0, (SOCKADDR *)udp->dest, (socklen_t *)&udp->dest_size);
j'ai lut dans le man que udp->dest_size était une variable retour.
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.
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:
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;
} |
qui malheureusement ne fonctionne qu'ainsi :
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;
} |
Partager