Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-07-2014, 15:47   #61
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
@Mettiu_
Quote:
non c'è ragione per cui l'int possa essere spezzettato se il trasmettitore fà una sola send().
Ti invito a vedere questo esempio che avevo fatto:
Quote:
Originariamente inviato da Daniels118
[..] immagina questa situazione con dei pacchetti da 512 byte:
1) invio un messaggio da 506 byte + 4 per la lunghezza, ma il pacchetto non parte perché il buffer ha ancora spazio per 2 byte e il sistema aspetta ancora un po' per vedere se si riempie;
2) subito dopo invio un messaggio di 100 byte + 4 per la lunghezza;
3) il sistema bufferizza i dati e li divide in due pacchetti, il primo contiene 4+506+2 byte, il secondo ne contiene 2+100;
4) il client riceve il primo pacchetto e ne legge 4 byte, vede che il dato è lungo 506 byte e li legge;
5) il buffer contiene ancora 2 byte, quindi il client prova a leggere 4 byte, ma ne ottiene solo due perché il secondo pacchetto non è ancora arrivato, quindi interpreta male la lunghezza del dato... da qui in poi si scatena l'inferno
Questo non significa che facendo una sola recv il programma non funziona mai, ma significa che a volte potrebbe funzionare e a volte no. Per l'esattezza se siamo fortunati potrebbe anche funzionare sempre, se si verificano le condizioni che avevo in un post successivo.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 07-07-2014, 15:56   #62
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
No. Come dicevo, in C99 "char message[]" come ultimo membro di una struct e quando effettivamente preceduto da (almeno) un altro named member non è un puntatore ma un incomplete array type che prende il nome di "flexible array member". Studialo nello standard.
Ammetto di essere rimasto qualche standard indietro, se ne avrò la necessità mi aggiornerò
Quote:
L' "equivalenza" tra array e puntatori non esiste - non sono la stessa cosa. Punto. Sono intercambiabili in alcune circostanze, che è molto diverso. Possibile sia così difficile da capire?
Non è difficile da capire, come giustamente affermi dipende dalle circostanze, purtroppo l'uso improprio di alcuni termini a volte diventa un'abitudine.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 07-07-2014, 17:01   #63
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Si, se usi gli shift puoi fare a meno di ntohl.
ma alla fine comunque un ntohl lo devo fare o sbaglio ?

cioè io shifto il valore che ho ricevuto di (8bit*il numero di byte letti) e poi faccio la or con i byte letti al nuovo giro.

Ma con questa soluzione ho due dubbi :

- ammettendo di aver fatto la procedura corretta alla fine quando ho il dato definitivo devo comunque usare ntohl sulla variabile contenente la lettura finale o sbaglio ?

- questo metodo funziona se il primo byte ricevuto è il byte più significativo, non so come mai ma nella mia testa ho dato per scontato funzionasse così, ma è realmente così ?
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2014, 07:28   #64
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
No, se usi lo shift non c'è bisogno di usare ntohl perché sei tu stesso a controllare l'ordine dei byte.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2014, 08:50   #65
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
No, se usi lo shift non c'è bisogno di usare ntohl perché sei tu stesso a controllare l'ordine dei byte.
Ho riguardato il codice e qualcosa non torna devo rivedere un pò la logica della bufferizzazione dell'int

In pseudocodice :

lato client :
Codice:
send(intero 32bit)
lato server :
Codice:
ret=recv(&temp)
variabile lunghezza salvata nella struttura client
poi ad ogni recv farò una cosa del genere :

Codice:
rimanenti=4-ret;
lunghezza | temp
if(ret != rimanenti) //non ho finito di ricevere 
client->lunghezza<<8*ret (shifto la lunghezza per metterla in posizione di aggiungerci i byte che verranno ricevuti al giro dopo)
if (ret==rimanenti)  
{
    client-> temp = 0; 
    client->rimanenti = 4;
    return;
}
Facendo così però mi va bene se il client invia il byte in questo modo:

parte più significativa
parte meno significativa

così il ricevitore riceverà prima la parte più significativa e poi la parte meno significativa.

Se lato sender invio in network byte order send(htonl(lunghezza)) quindi con la parte più significativa a destra dovrei ricevere lato ricevitore prima la parte più alta e poi quella più bassa giusto ?

Ultima modifica di aeroxr1 : 09-07-2014 alle 08:59.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2014, 09:12   #66
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12810
Quote:
Originariamente inviato da Daniels118
[..] immagina questa situazione con dei pacchetti da 512 byte:
1) invio un messaggio da 506 byte + 4 per la lunghezza, ma il pacchetto non parte perché il buffer ha ancora spazio per 2 byte e il sistema aspetta ancora un po' per vedere se si riempie;
2) subito dopo invio un messaggio di 100 byte + 4 per la lunghezza;
3) il sistema bufferizza i dati e li divide in due pacchetti, il primo contiene 4+506+2 byte, il secondo ne contiene 2+100;
4) il client riceve il primo pacchetto e ne legge 4 byte, vede che il dato è lungo 506 byte e li legge;
5) il buffer contiene ancora 2 byte, quindi il client prova a leggere 4 byte, ma ne ottiene solo due perché il secondo pacchetto non è ancora arrivato, quindi interpreta male la lunghezza del dato... da qui in poi si scatena l'inferno
Tu dici ho un pacchetto con: 4+506+2 bytes.

Leggo 4, capisco che devo leggere altri 506, leggo 506. Rimangono 2 bytes.

Quando chiedo 4 bytes, ovviamente mi devo assicurare che la recv legga 4 bytes, quindi il giusto modo di fare la cosa è fare la recv in un ciclo finché non leggo effettivamente il giusto numero di bytes.

Quello che dici non è un problema.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2014, 09:54   #67
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Tu dici ho un pacchetto con: 4+506+2 bytes.

Leggo 4, capisco che devo leggere altri 506, leggo 506. Rimangono 2 bytes.

Quando chiedo 4 bytes, ovviamente mi devo assicurare che la recv legga 4 bytes, quindi il giusto modo di fare la cosa è fare la recv in un ciclo finché non leggo effettivamente il giusto numero di bytes.

Quello che dici non è un problema.
si infatti lui mi ha consigliato di fare un ciclo per finire di leggere i byte rimanenti

Solo che il mio server deve essere monoprocesso monothread e devo usare la select , ma al tempo stesso non vorrei rimanere in loop per troppo tempo aspettando di aver ricevuto tutti i byte.

Per questo mi ha poi consigliato di gestire un buffer

Ora il buffer per la stringa dati mi sembra di averlo fatto e teoricamente mi sembra funzioni.

Il buffer per la ricezione dell'int della lunghezza del dato invcece mi crea non pochi problemi

EDIT [forse così potrebbe funzionare] :
Codice:
int riceviLength() //usando lo shift sistemo i byte in host order senza usare la funzione ntohl 
{
   //in realtà inviando un int per la dimensione invio ben 4byte, devo gestire un buffer per la lunghezza
  int ret;
  int temp; //al suo interno ci viene salvato il dato letto
  ret = recvTCP(client->socket,&temp,4-client->last);
  client->length=(client->length)<<(8*(ret)); 
  client->length=(client->length)|temp;  
  
  if(ret<0) return -1; //c'è stata una chiusura della connessione già gestita dalla recvTCP o il dato è ricevuto correttamente
  if (ret==0)  //abbiamo finito di leggere
  {
  	client->last=0;
  	return 0;
  }
  client->last=client->last-ret;
  return ret;
}
ha qualche problemuccio questa funzione ?

Ah recvTCP mi ritorna 0 se ho letto tutto length , -1 se ci sono stati errori , ret se non abbiamo ancora finito di leggere.

Ultima modifica di aeroxr1 : 09-07-2014 alle 10:14.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2014, 13:33   #68
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12810
Quote:
Originariamente inviato da aeroxr1 Guarda i messaggi
si infatti lui mi ha consigliato di fare un ciclo per finire di leggere i byte rimanenti

Solo che il mio server deve essere monoprocesso monothread e devo usare la select , ma al tempo stesso non vorrei rimanere in loop per troppo tempo aspettando di aver ricevuto tutti i byte.
Questo è inevitabile, a meno di non usare socket non bloccanti.

Se ti aspetti di leggere 4 bytes, dovrai per forza aspettare che arrivino .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2014, 15:40   #69
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Questo è inevitabile, a meno di non usare socket non bloccanti.

Se ti aspetti di leggere 4 bytes, dovrai per forza aspettare che arrivino .
QUel problema l'ho risolto con gli stati

3 stati :
stato 0 -> attesa comando
stato 1 -> attesa lunghezza dati
stato 2 -> attesa dato

Ogni client ha una struttura e in essa è presente una variabile stato ultimo dato letto e un buffer, e da uno stato a l'altro ci va solo quando ha finito di fare la lettura. Così nel frattempo che il determinato socket non ha i dati disponibile la select riprende il controllo e può gestire le altre connessioni.

Mi manca di capire se ho gestito in maniera corretta i buffer. Che in locale è difficile capirlo

Ultima modifica di aeroxr1 : 09-07-2014 alle 15:50.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2014, 19:15   #70
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
ah scusate , ho una domandina nuova

Se mando una stringa avete detto non c'è problemi di endianess, come mai questa differenza di comportamento ?

e una domanda un pò off topic :

scanf vs fgets nella lettura dello stdin .

se leggo la stringa "pippo" e l'assegno alla variabile stringa usando scanf questa mi lascia \n in memoria e aggiunge l'eof a pippo e quindi in stringa ci sarà "pippo\0"
con fgets il buffer stdin mi viene completamente ripulito e viene assegnato a stringa "pippo\n\0" ? corretto ?
Quindi in una lettura di un un numero che poi dopo vado a convertire con strtol tutto ok perchè \n non me lo converte , ma se devo leggere una stringa è bene elimini l'ultimo carattere \n o sbaglio ? Come dovrei gestire questa situazione

Ultima modifica di aeroxr1 : 10-07-2014 alle 19:56.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2014, 13:01   #71
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Se mando una stringa avete detto non c'è problemi di endianess, come mai questa differenza di comportamento ?
Alcune famiglie di processori scambiano l'ordine dei byte quando li copiano tra memoria e registri. Ciò naturalmente vale solo quando si copiano 2 o più byte alla volta, e di conseguenza si applica alla maggior parte dei tipi di dato numerici ed anche alle stringhe con codifica multibyte.
Questa differenza di comportamento è nata diversi decenni fa, fondamentalmente per risparmiare sulla realizzazione dei circuiti (non so nello specifico in che modo), ed è stata ereditata dai processori più recenti per mantenere la retrocompatibilità.
Anche i compilatori possono impattare sull'endiannes quando lavorano con dati la cui dimensione supera quella dei registri, in questi casi infatti è il compilatore stesso a decidere l'ordine delle "parole" in memoria.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2014, 08:17   #72
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
ma quindi se invio la stringa

char pippo[10]={asino/0};

dall'altra parte, dato che invio 6 byte non è detto che arrivi la parola nell'ordine corretto ?

aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2014, 11:49   #73
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
Quote:
Originariamente inviato da aeroxr1 Guarda i messaggi
ma quindi se invio la stringa

char pippo[10]={asino/0};

dall'altra parte, dato che invio 6 byte non è detto che arrivi la parola nell'ordine corretto ?

No.
Come ti è stato detto,
Quote:
si applica alla maggior parte dei tipi di dato numerici ed anche alle stringhe con codifica multibyte.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes]
"Pirating software? Choose Microsoft!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2014, 11:57   #74
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La risposta di Oceans11 è corretta.
Il motivo è che quando copi una stringa con codifica a byte singolo (per esempio ASCII), l'algoritmo copia i byte uno alla volta, nell'ordine in cui si trovano.
Se invece copi una stringa con codifica a 2 byte, l'algoritmo potrebbe copiare i byte due per volta (nel senso che fa un'unica MOVE a 16 bit); l'ordine delle lettere resta invariato, ma l'ordine dei byte di ciascuna lettera potrebbe essere invertito o meno in base all'endiannes.
Se hai intenzione di utilizzare codifiche multibyte devi tener conto anche di questo aspetto, altrimenti puoi semplicemente ignorarlo.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2014, 08:51   #75
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
La risposta di Oceans11 è corretta.
Il motivo è che quando copi una stringa con codifica a byte singolo (per esempio ASCII), l'algoritmo copia i byte uno alla volta, nell'ordine in cui si trovano.
Se invece copi una stringa con codifica a 2 byte, l'algoritmo potrebbe copiare i byte due per volta (nel senso che fa un'unica MOVE a 16 bit); l'ordine delle lettere resta invariato, ma l'ordine dei byte di ciascuna lettera potrebbe essere invertito o meno in base all'endiannes.
Se hai intenzione di utilizzare codifiche multibyte devi tener conto anche di questo aspetto, altrimenti puoi semplicemente ignorarlo.
scusate ho domandato senza nemmeno essere sicuro di aver capito completamente la risposta , avevo confuso la "codifica multibyte" con una stringa di più byte

Grazie a tutti
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2014, 16:11   #76
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Ho un grosso problema , ma non sapendo bene fare ad usare il debug è difficile che riuscirò a risolverlo

Non capisco come , ma nonostante elimini un elemento dalla lista dei client al passo dopo mi continua a dire che quell'elemento è ancora presente .. boh...

Ho trovato dove è l'errore, ma non capisco come mai....
Qualche anima pia , ha due secondi per dare un occhiata al file ?

Ecco di seguito :

Codice:
struct elemento 
{ 
	char username[256]; //Username del giocatore [max 14 caratteri]
	short int UDPport;
	unsigned long IPaddress;
	int socket; //id del socket
	char ready; //indica se il client ha effettuato il login o è sempre in attesa di login e quindi non ancora connesso
	char impegnato; //mi indicherà Se il client è impegnato in un'altra partita
	char cmd ; //il comando che stiamo eseguendo. Inizialmente in waiting !
	int stato; //variabile di stato che mi dice in che parte della macchina a stati si trova il client
	int length; //lunghezza campo dati
	char buffer[256]; //buffer dove vengono ricevuti i dati temporaneamente prima di essere ricevuti completamente, buffer dinamico
	int last; //variabile che indica fino a che punto abbiamo riempito il buffer in caso di lettura non terminata
	struct elemento *next; //puntatore all'elemento successivo della lista
	struct elemento *enemy; //puntatore alla struttura dell'avversario
};

typedef struct elemento player;
di seguito la funzione che uso per creare un elemento player :

Codice:
player *creatElem(int socket,unsigned long IPaddress)
{
  player *elem = NULL;
  elem = malloc(sizeof(player));
  elem->IPaddress = IPaddress;
  elem->socket = socket;
  elem->ready = NO; //inizialmente si crea l'elemento ma non è realmente connesso ! 
  elem->impegnato = NO;
  elem->next = NULL;
  elem->enemy = NULL;  //puntatore al socket dell'avversario
  elem->stato = 0;
  elem->last=0;
  memset(elem->username,0,sizeof(elem->username));
  memset(elem->buffer,0,sizeof(elem->buffer));
  return elem;  //ritorno l'elemento creato
}
// PARTE DEL MAIN CHE MI CREA PROBLEMI
Codice:
for(i=0;i<=fdmax;i++)
		{
			if(FD_ISSET(i,&read_fds)){ //controlla se un descrittore è settato
		 		if (i==listener) // se è il listener vuol dire che c'è una nuova connessione in sospeso 
		 		{	
		 		    //gestisco la nuova connessione
		 			addrlen = sizeof(clientaddr);
		 			newfd=accept(listener,(struct sockaddr*)&clientaddr,&addrlen);
		 			if(newfd==-1)
		 			{
		 				perror("errore nell'accept");
		 				exit(1);
		 			}
		 			printf("connessione stabilita con il client\n");
		 			FD_SET(newfd,&master); //setto il descrittore del socket appena connesso nel master
		 			if (newfd>fdmax) fdmax=newfd; //fdmax segnala quale è il più alto descrittore
					//creo un elemento del tipo Player socket newfd e ind IPaddress e lo inserisco nella lista ""inconnection"
		 			client=creatElem(newfd,clientaddr.sin_addr.s_addr);
		 			addToList(client); 
		 			printf("Il nuovo elemento puntato è : %s \n",client->username);
		 		}
		 		else
		 		{
		 			// gestisco dei dati provenienti da uno dei client che sono o nella lista connessi
		 			client=elem_findbysock(i); 
		 			if (client==NULL)
		 			{
		 				printf("il client non esiste, deve esserci stato un errore\n");
		 				exit(1);
		 			}
		 			//è stato trovato un client, verifichiamo in che stato si trova tale client
		 			
		 		......................
se levo la parte in neretto , nella parte in rosso nonostante crei un nuovo elemento con la malloc rimane comunque il dato inserito da un utente che è stato rimosso precedentemente.

Come è possibile ? Dove ho sbagliato ??

Ultima modifica di aeroxr1 : 15-07-2014 alle 16:51.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2014, 18:33   #77
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Allora ho deciso passo alla codifica del numero in un char da 4byte con sprintf come mi ha consigliato @Daniels118

(con la shift non sono sicuro sia riuscito ad implementarla nel modo corretto)

Quindi farò così :

Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Nulla di più vero di quanto dice Oceans11.
Suggerirei di convertire il numero che rappresenta la lunghezza del dato in una stringa di lunghezza fissa, per esempio int 5 diventa char[4] "0005", in questo modo la lettura diventa più semplice (leggi sempre 4 byte fissi) e risolvi il problema dell'endianess.
In realtà leggo sempre 5byte non 4byte inviando una stringa di 4 giusto ? sarebbe tipo 0005\0 o sbaglio ?

Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Ricordati che la recv non ritorna il dato letto, ma devi passare in input un puntatore ad un buffer. Io personalmente farei così:
Codice:
char buf[4];
int n = 0;
while (n < 4) {
  n += recv(sockfd, &buf[n], 4 - n, 0);
}
mettendo un bel buf[5] e il ciclo n<5 , no ?

p.s : in effetti potrei anche evitare di ricevere \0 , però mi potrebbe tornare utile quando chiamerò la funzione di conversione da stringa ad intero

Ultima modifica di aeroxr1 : 17-07-2014 alle 00:20.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
Questi nanorod potrebbero cambiare il fu...
realme C71: l’entry-level con display 12...
Destiny 2 conquista Steam: la nuova espa...
Da fan di Hitler a ragazzina sexy: ecco ...
La Stark Varg è un successo senza...
Addio Wi-Fi ballerino in vacanza: da Kee...
Epic ne umilia altri due: scuse pubblich...
Insta360 Connect: la nuova era delle vid...
Kyndryl annuncia il Microsoft Accelerati...
Blitz mondiale dell'FBI: sequestrati div...
La Difesa USA ha annunciato nuove collab...
Non solo NVIDIA, luce verde anche per AM...
Recensione Xiaomi Smart Band 10: cambia ...
In Italia abbiamo un problema con l'IA: ...
OnePlus e l’intelligenza artificiale: ec...
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: 18:07.


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