J'utilise l'option SO_REUSEADDR, mais je ne suis pas sûr de savoir pourquoi j'obtiens Option non disponible temporaire de ressource.SO_REUSEADDR avec datagrammes UDP - Ressource indisponible
Je teste le code du serveur client sur 127.0.0.1
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket() error!!\n");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
perror("SO_REUSEADDR failed::");
exit(1);
}
while(1) {
nbytes_read = recvfrom(sockfd, (void *)&recvd_msg, sizeof(recvd_msg),
flags, &from, &from_len);
printf("nbytes_read = %d\n", nbytes_read);
if(nbytes_read == -1) {
perror("client: recvfrom() failed");
return FAILED;
}
if (nbytes_read > 0) {
if(recvd_msg.hdr.msgtype == DATA)
printf("recvd %d bytes from server\n", recvd_msg.hdr.payload_size);
ftp_show_payload(&recvd_msg);
}
if(recvd_msg.hdr.is_last == TRUE) {
break;
}
}
Message d'erreur: "client: recvfrom() a échoué: Ressource temporairement indisponible"
errno: 11
Après essayer d'exécuter le client pour 3-4 fois, je reçois les données, je ne suis pas sûr de ce qui se passe.
En outre, ce problème est sur Ubuntu Linux, mais quand je lance le même serveur client sur Solaris, ça marche bien !!
Vous n'avez pas besoin de l'étiquette ou du goto. Utilisez continuer. Et vous pouvez seulement obtenir zéro en mode non-bloquant, auquel cas vous devriez sélectionner(), pas seulement tourner. Et vous n'avez pas besoin de 'else' après 'return'. – EJP
ok, j'ai changé tout ce que vous avez dit, mais je ne sais toujours pas pourquoi je reçois EAGAIN (ressource indisponible) .. – Anonymous
Non, vous n'avez pas. Si vous obtenez EAGAIN, vous devez être en mode non bloquant, vous devez donc appeler select() pour vous indiquer quand les données sont disponibles. – EJP