Torna indietro   Hardware Upgrade Forum > Software > Programmazione

FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III è la nuvoa fotocamera mirrorless pensata per chi si avvicina alla fotografia e ricerca una soluzione leggera e compatta, da avere sempre a disposizione ma che non porti a rinunce quanto a controllo dell'immagine.
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Da Las Vegas, la visione di Larry Ellison e la concretezza di Clay Magouyrk definiscono la nuova traiettoria di Oracle: portare l’intelligenza artificiale ai dati, non i dati all’intelligenza, costruendo un’infrastruttura cloud e applicativa in cui gli agenti IA diventano parte integrante dei processi aziendali, fino al cuore delle imprese europee
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Dalla precisione estrema dei componenti alla gestione digitale dei processi: come la piattaforma ServiceNow consente ad Aston Martin Aramco Formula One Team di ottimizzare risorse IT e flussi operativi in un ambiente dove ogni millesimo di secondo conta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-06-2007, 17:10   #1
x-t
Member
 
Iscritto dal: Sep 2006
Messaggi: 207
[c] socket UDP, timeout....AIUTO!

Salve a tutti!
Sto avendo un problema con i socket UDP.
Per inviare/ricever un buffer utilizzo le funzioni sendto(...) recvfrom(...).
Ad esempio, per l'invio:

if (sendto(s, buffer_invio, dimensione_buffer_invio, 0,(struct sockaddr*)&peeraddr_in, &addrlen) != 1) {fprintf(stderr, "Connection aborted on error"); exit(1);}

e per la ricezione:

while (len = recvfrom(s,buffer_ricezione , dimensione_buffer_ricezione, 0,(struct sockaddr*)&peeraddr_in, &addrlen)) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dimensione_buffer_ricezione) {len1 = recvfrom(s, &buffer_ricezione[len], dimensione_buffer_ricezione - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;}

Il problema si presenta nel caso in cui si perde un pacchetto... In questo caso infatti la chiamata recvfrom() resta bloccata e il programma non procede.
Volevo sapere come è possibile impostare un timeout sulla recvfrom().
Qualcuno mi può aiutare?
Grazie 1000
P.S. non suggeritemi di utilizzare il TCP perchè per quello che devo fare è necessario usare l'UDP.

P.P.S.
Avevo pensato di poter interrompere la recvrom in questo modo:
......
double timeout=2; //timeout di 2 secondi
tstart(); //faccio partire un contatore
while ((len = recvfrom(s,buffer_ricezione , dimensione_buffer_ricezione, 0,(struct sockaddr*)&peeraddr_in, &addrlen))) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dimensione_buffer_ricezione) {if(tval()>timeout) goto time_out_verificato; len1 = recvfrom(s, &buffer_ricezione[len], dimensione_buffer_ricezione - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;}
time_out_verificato:
.....

ma non ha funzionato.... evidentemente non rimane il blocco sul ciclo while, ma proprio sulla recvrom().... spero di essere stato chiaro...

Ultima modifica di x-t : 24-06-2007 alle 17:16.
x-t è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 10:25   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da x-t Guarda i messaggi
Volevo sapere come è possibile [b]impostare un timeout sulla recvfrom().
Su sistemi linux, usa la poll seguita dalla recvfrom con flag MSG_DONTWAIT.
Su win32, una la select seguita dalla normale recvfrom.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 11:15   #3
alemuscolino
Bannato
 
Iscritto dal: Apr 2007
Messaggi: 54
AIUTOOOOOOOOOO!!!!

Sto impazzendo anch'io con i socket udp!!!!! Non riesco a impostare il timeout!!!! e su internet nn esistono esempi!!!
Come si usa la select () su windows??
VI PREGO AIUTO!
alemuscolino è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 11:27   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da alemuscolino Guarda i messaggi
e su internet nn esistono esempi!!!
Oh mamma!
http://www.google.it/search?hl=it&q=...nG=Cerca&meta=
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 11:41   #5
alemuscolino
Bannato
 
Iscritto dal: Apr 2007
Messaggi: 54
Oh potenete ilsensine...
Io nn sto trovando un pezzo di codice semi decente in cui è spiegato come utilizzare select() prima della recvfrom()...
Ti prego aiutami, attendo fonte d'illuminazione...(un pò di codice pulito)
alemuscolino è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 11:50   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Completamente non testato, ma ti rende l'idea...
Codice:
SOCKET sock = <il tuo socket>;
fd_set ifds;
long timeout_usec = 1000000; // il tuo timeout, in us
struct timeval timeout;
int ret;

assert(sock<FD_SETSIZE); // Definisci una tua FD_SETSIZE se capita questo

FD_ZERO(&ifds);
FD_SET(sock, &ifds);

timeout.tv_sec = timeout_usec / 1000000;
timeout.tv_usec = timeout_usec % 1000000;

ret = select(sock+1, &ifds, NULL, NULL, &timeout);
if (ret<=0 || !FD_ISSET(sock,  &ifds)) {
 /* timeout o errore */
} else {
 /* Dati in ingresso al socket; puoi qui usare la recvfrom senza bloccare */
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 12:40   #7
alemuscolino
Bannato
 
Iscritto dal: Apr 2007
Messaggi: 54
AIUTOOOOOOOOOOOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!

Grazie per la risposta.. ma ancora nn ci siamo.
1. Intanto ho dovuto togliere assert(sock<FD_SETSIZE); perchè altrimenti nn compilava (è grave?)
2.
if (ret<=0 || !FD_ISSET(sock, &ifds)) {
/* timeout o errore */
} else {
/* Dati in ingresso al socket; puoi qui usare la recvfrom senza bloccare */
}

nn è che forse è al contrario?? ovvero:

if (ret<=0 || !FD_ISSET(sock, &ifds)) {
/* Dati in ingresso al socket; puoi qui usare la recvfrom senza bloccare */
} else {
/* timeout o errore */
}

io credo di si.
3.si blocca in ogni caso... non funziona..

TI PREGO AIUTAMI!
alemuscolino è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 12:52   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da alemuscolino Guarda i messaggi
1. Intanto ho dovuto togliere assert(sock<FD_SETSIZE); perchè altrimenti nn compilava (è grave?)
Ti ci avevo messo tanto di commento...
metti qualcosa tipo
#define FD_SETSIZE 16384
all'inizio del file, prima di tutti gli include. Non sono sicuro che windows onora FD_SETSIZE, ma lo standard posix lo richiede.

Quote:
nn è che forse è al contrario??
No. Se i dati sono presenti, ret è >0 e FD_ISSET(sock, &ifds) è true.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2007, 13:02   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da alemuscolino Guarda i messaggi
1. Intanto ho dovuto togliere assert(sock<FD_SETSIZE); perchè altrimenti nn compilava (è grave?)
Ah no scusa, avevo letto male. E' un errore di compilazione, devi includere <assert.h>
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1 Micron e millisecondi: la piattaforma ServiceNow...
ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme ASUS GeForce RTX 5080 Noctua OC Edition: una cus...
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Ferrari F76: la prima hypercar NFT segna...
Am9080, sono passati 50 anni dal primo p...
Inquinamento record a Nuova Delhi: il go...
Il Giappone e il 'fetish' per i dischi o...
AMD presenterà il Ryzen 5 7500X3D...
Un aspirapolvere intelligente diventa un...
Il nuovo M5 fa la differenza anche nel g...
Le AirPods ora sono in grado di rilevare...
Oggi su Amazon succede di tutto: sconti ...
'Copilot Gaming mi spiava!': le accuse d...
Mova P50 Pro Ultra, robot aspirapolvere ...
Speciale action cam: doppio sconto solo ...
Eureka J15 Ultra conquista Amazon: aspir...
Game Pass è sempre più ric...
20 milioni di utenti contro Apple: grand...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:54.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v