Sto utilizzando socket c per implementare un protocollo UDP affidabile. Sto usando il seguente codice per impostare un timeout su un socket in cui sto aspettando un riconoscimento. Non sono sicuro del motivo per cui sto ricevendo errno 11, risorsa temporaneamente non disponibile.Errno: 11, Risorsa temporaneamente non disponibile
//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++;
}
Ho anche provato il metodo di selezione indicato nei commenti. Ho il seguente codice all'interno di un ciclo, ma il recvfrom non va mai fuori tempo.
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");
}
Provare a utilizzare le prese select() e non bloccanti. L'approccio select() è molto più flessibile, affidabile e portatile. –
Non c'è nessuna chiamata a 'recvfrom()' int he second snippet. – alk
'recvfrom()' restituisce 'ssize_t' not' int', BTW. – alk