Ich verwende C-Sockets, um ein zuverlässiges UDP-Protokoll zu implementieren. Ich verwende den folgenden Code, um ein Timeout für einen Socket festzulegen, in dem ich auf eine Bestätigung warte. Ich bin nicht sicher, warum ich errno 11 bekomme, Ressource vorübergehend nicht verfügbar.Errno: 11, Ressource vorübergehend nicht verfügbar
//set timer for recv_socket
struct timeval tv;
tv.tv_usec = TIMEOUT_MS;
if(setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0){
printf("Error setting the socket timeout.\n");
}
int recv_msg_len;
if(recv_msg_len = recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
(struct sockaddr *) &servAddr2, &fromSize) < 0){
//timeout reached
printf("Error Reporting: %d : %s\n", errno, strerror(errno));
num_timeouts++;
}
Ich habe auch die select-Methode versucht, die in den Kommentaren erwähnt wurde. Ich habe den folgenden Code innerhalb einer Schleife, aber die recvfrom nie aus.
fd_set set;
FD_ZERO(&set); /* empties the set */
FD_CLR(rcv_sock,&set); /* removes FD from the set */
FD_SET(rcv_sock,&set); /* adds FD to the set */
if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < 0){
printf("\nError Reporting: %d : %s\n\n", errno, strerror(errno));
return -1;
}
if(!FD_ISSET(rcv_sock,&set)){ /* true if FD is in the set */
printf("socket is not set properly.\n");
}
Verwenden Sie stattdessen die Select() - und nicht blockierenden Sockets. Der select() -Ansatz ist viel flexibler, zuverlässiger und portabler. –
Im zweiten Snippet wird 'recvfrom()' nicht aufgerufen. – alk
'recvfrom()' gibt 'ssize_t' nicht' int' zurück, BTW. – alk