Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Turtle Beach Vulcan II TKL Pro: una tastiera analogica senza compromessi
Recensione Turtle Beach Vulcan II TKL Pro: una tastiera analogica senza compromessi
Abbiamo messo le mani sulla Vulkan II TKL Pro, tastiera hall effect di Turtle Beach che offre un'ampia gamma di funzionalità molto ricercate dai giocatori più esigenti. Ci ha accompagnati per oltre un mese nelle nostre sessioni di gioco e non solo: ecco le nostre impressioni.
SuiteWorld e CloudWorld: nel 2024 le parole d'ordine sono neutralità e apertura
SuiteWorld e CloudWorld: nel 2024 le parole d'ordine sono neutralità e apertura
Siamo volati a Las Vegas per prendere parte a un doppio evento: Oracle CloudWorld e NetSuite SuiteWorld, per la prima volta, si sono svolti in contemporanea. Più che un dettaglio logistico, questa doppia conferenza ci ha permesso di capire come entrambe le aziende stiano cambiando profondamente il proprio approccio: Oracle si posiziona come un fornitore neutrale di tecnologia, mentre NetSuite si apre maggiormente
Recensione Nothing Phone (2a) Plus: poco Plus ma è sempre più convincente
Recensione Nothing Phone (2a) Plus: poco Plus ma è sempre più convincente
Nothing decide di porre sul mercato una versione Plus del suo intrigante Phone (2a). Una versione appena più pompata nel processore, con delle variazioni nel design della scocca e con qualche altra chicca. La sostanza non cambia, il prezzo varia di poco ma il tutto è sempre più convincente. 
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-07-2014, 09:48   #21
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Io pensavo ad unica send in cui inviavo un buffer
char *buffer[256]

fino alla lunghezza riempita

5cpippo

E di là 1 recv per ricevere 5c (cavolo in effetti sono due byte rischierei un errore)

e un altra recv con len 5 per ricevere pippo .

In effetti è una soluzione sparta da bimbiminkia

Indeciso tra questa soluzione e tra l'inviare due send una per la lunghezza e una per il msg + usare una variabile per gli stati

Devo scegliere una via e portarla avanti senza guardarmi indietro

Ultima modifica di aeroxr1 : 03-07-2014 alle 09:51.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 10:50   #22
van9
Member
 
Iscritto dal: Nov 2012
Messaggi: 126
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Codice:
struct message_header
{
    uint32_t length;
    char variable_message[0]; // nn ricordo ma dovrebbe funzionare su C99
};
In pratica inserisci nella struttura un campo che il compilatore interpreta come un array di char (attenzione, un array in-place, non un puntatore ad un array posizionato chissà dove), ma non ne definisci la lunghezza, poi a runtime allochi la struttura con dello spazio eccedente ed accedi al campo sforando oltre la dimensione teorica (0).
Se da qualche errore di compilazione si può tranquillamente definire l'array di lunghezza 1 e poi ricordarsi di allocare un byte in meno (ma anche se ci dimentichiamo non satureremo la memoria per un solo byte).
La dimensione a zero non è mai stata valida per lo standard - un compilatore (no estensioni ovviamente) che non emette un warning in questo caso è da buttare. La dimensione ad uno è legale, ma invoca undefined behavior quando vai ad accedere oltre il primo elemento e se le ottimizzazioni sono attive può accadere di tutto. La cosa giusta è "char variable_message[];" usando C99. Se C99 non è un'opzione si usa la dimensione ad uno ma è meglio controllare cosa combina il compilatore.

C and C++, where (almost) everything is not what it seems...

Ultima modifica di van9 : 03-07-2014 alle 21:41.
van9 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 11:04   #23
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
Sì scusate, non stavo tenendo conto della select.
Il codice rimane quello, con l'aggiunta del controllo su FD_ISSET e il settaggio delle opportune variabili di stato, che a mio parere sono obbligatorie.
La dimensione del buffer di invio è irrilevante, mentre in ricezione te ne servono 2 di buffer: uno per dimensione oaylod + comando (se ha dimensione fissa) e il secondo che allochi a runtime in base a ciò che hai ricevuto.
Questo vuol dire che oltre al file descriptor, il server deve mantenere, per ogni connessione, la dimensione del payload, il comando e il buffer del payload (almeno parziale).
Ti suggerirei una struct che contenga il tutto e funzioni per serializzare/deserializzare i suoi dati.

Se questa soluzione non ti piace, puoi dare uno sguardo all'opzione del socket SO_RCVLOWA che ti permette di impostare il valore minimo in byte di soglia necessario a far ritornare la select. Non ho mai provato e non mi sento di consigliarlo.
__________________
"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 03-07-2014, 11:24   #24
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da aeroxr1 Guarda i messaggi
[..]
Indeciso tra questa soluzione e tra l'inviare due send una per la lunghezza e una per il msg + usare una variabile per gli stati
Come già detto, dovendo fare la conversione del numero ti consiglio le due send, semplicemente per comodità... potremmo fare anche delle considerazioni su cosa sia meglio o peggio in termini di performance, ma visto che non stai scrivendo un server per streaming video direi che le performance possono passare in secondo piano.
Quote:
Se questa soluzione non ti piace, puoi dare uno sguardo all'opzione del socket SO_RCVLOWA che ti permette di impostare il valore minimo in byte di soglia necessario a far ritornare la select. Non ho mai provato e non mi sento di consigliarlo.
Questa non la sapevo, ma leggo che su linux il valore è bloccato ad 1 byte... peccato.

Ribadisco anche io la necessità di una variabile di stato per ogni connessione, naturalmente solo sul client.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 11:57   #25
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
ok quindi credo farò così :
- due send una fissa di un byte con la dimensione del campo successivo che verrà inviata con la send subito dopo
- sul server terrò una lista con un elemento per ogni client , contenente i vari buffer per ogni client e la variabile di stato che mi dirà in che punto sono della comunicazione client server
- la variabile comando potrei inviarla successivamente tanto il primo comando è per forza di cose l'invio dello username
- dopo negli invii successivi andrò a vedere cosa c'è nel campo data e qui ci sarà il comando e per ogni comando mi sposterò nello stato opportuno

Fin qui ragiono male ? (poi per carità lo deve vedere in pratica, però l'idea sarebbe questa )

per serializzare i dati della struct che andrò ad inviare passo passo, dato che la mia struct conterrà solo caratteri [username e comandi] e numeri interi , potrei usare per questi ultimi le semplici funzioni htons() , ntohs() , htonl() e ntohl() ?

E un ultima cosa la creazione del buffer dinamico sul server, io inizialmente pensavo di creare una struttura con all'interno un campo username[256], comando ecc ecc.
Allocando staticamente i vettori con uno spazio grande a sufficienza, e non usare la creazione dinamica, poichè non sono capace a creare un allocazione dinamica di stringhe-vettori in C , però mi rendo conto che lo spreco è alto

Vabbè sarà il caso di capire come creare allocazione dinamica di vettori
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 12:15   #26
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
No, dai, studia prima l'allocazione dinamica e poi ti cimenti coi socket!
Per il futuro, quando vorrai fare delle ottimizzazioni, ricordati di non allocare e deallocare continuamente, sono operazioni che costano, pensa bene dove vale la pena risparmiare e accorpa quello che si può accorpare.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 12:18   #27
van9
Member
 
Iscritto dal: Nov 2012
Messaggi: 126
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
( SO_RCVLOWAT )
Questa non la sapevo, ma leggo che su linux il valore è bloccato ad 1 byte... peccato.
Quella è SO_SNDLOWAT, di SO_RCVLOWAT puoi fare il set ma poi non hai signaling affidabile e quindi serve a nulla.
van9 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 12:30   #28
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da van9 Guarda i messaggi
Quella è SO_SNDLOWAT, di SO_RCVLOWAT puoi fare il set ma poi non hai signaling affidabile e quindi serve a nulla.
Qui leggo:
Quote:
SO_RCVLOWT
[..] Note that not all implementations allow this option to be set.
Ancora, dalle manpages:
Quote:
socket(7):
"SO_RCVLOWAT and SO_SNDLOWAT
Specify the minimum number of bytes in the buffer until the socket layer will
pass the data to the protocol (SO_SNDLOWAT) or the user on receiving
(SO_RCVLOWAT). These two values are initialized to 1. SO_SNDLOWAT is not
changeable on Linux (setsockopt(2) fails with the error ENOPROTOOPT).
SO_RCVLOWAT is changeable only since Linux 2.4. The select(2) and poll(2) sys-
tem calls currently do not respect the SO_RCVLOWAT setting on Linux, and mark a
socket readable when even a single byte of data is available
. A subsequent
read from the socket will block until SO_RCVLOWAT bytes are available."
In altre parole SO_RCVLOWAT ha effetto solo sulla read (e su Linux solo a partire dalla versione 2.4), mentre su select e poll non ha alcun effetto.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 12:36   #29
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
No, dai, studia prima l'allocazione dinamica e poi ti cimenti coi socket!
Per il futuro, quando vorrai fare delle ottimizzazioni, ricordati di non allocare e deallocare continuamente, sono operazioni che costano, pensa bene dove vale la pena risparmiare e accorpa quello che si può accorpare.
In C non mi è così banale allocare dinamicamente uno spazio indefinito, cioè faccio per dire lo username può essere 10 caratteri,ma anche 40.
Quindi non so di quanto spazio allocare in memoria con la malloc
Cercando su internet ho letto della funzione realloc, in pratica gli si assegna un blocco di dimensioni x e poi se non basta con la realloc si riassegna un altro spazio contiguo (se esiste , già questa cosa mi lascia perplesso ) . Però non ho trovato la maniera di creare un buffer perfettamente adatto all'input.

Però riflettendoci in questo caso saprei quanti byte mi arrivano quindi creo una porzione per quei byte e la riempio
Il problema è più sul client , però li metto un buffer grande e grosso
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 13:20   #30
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La programmazione lascia abbastanza spazio alla fantasia, dipende dalla logica che vuoi utilizzare, comunque non restare nell'indecisione, intraprendi una strada che ritieni corretta, poi se ti si presenteranno dei problemi troverai il modo di affrontarli. Anche se commetti un errore non ti avvilire, sbagliando si impara
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 13:39   #31
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Non avessi sempre delle scadenze vicine da rispettare il tutto sarebbe meno stressante

COmunque grazie a tutti Provo un pò a mettere le mani nel codice vediamo che ne viene fuori Mi farò sicuramente risentire per rompervi le scatole con altri dubbi
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 14:00   #32
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Non avessi sempre delle scadenze vicine da rispettare il tutto sarebbe meno stressante

COmunque grazie a tutti Provo un pò a mettere le mani nel codice vediamo che ne viene fuori Mi farò sicuramente risentire per rompervi le scatole con altri dubbi
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 16:15   #33
van9
Member
 
Iscritto dal: Nov 2012
Messaggi: 126
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Qui leggo:
Si non è obbligatoria per dirsi POSIX, è solo un sistema opzionale per risparmiare copie dal kernel alla userland.

Quote:
Ancora, dalle manpages:

In altre parole SO_RCVLOWAT ha effetto solo sulla read (e su Linux solo a partire dalla versione 2.4), mentre su select e poll non ha alcun effetto.
Ah era nella man page, e io che d'istinto m'ero letto i sorgenti... babbè.
van9 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 16:20   #34
van9
Member
 
Iscritto dal: Nov 2012
Messaggi: 126
Quote:
Originariamente inviato da aeroxr1 Guarda i messaggi
In C non mi è così banale allocare dinamicamente uno spazio indefinito, cioè faccio per dire lo username può essere 10 caratteri,ma anche 40.
Un ottimo motivo per imparare a usare da subito librerie di qualità comprovata come Vstr o Bstring, e poi studiarsene gli internals e scriversi le proprie per imparare.
van9 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2014, 19:37   #35
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Quote:
Originariamente inviato da van9 Guarda i messaggi
Un ottimo motivo per imparare a usare da subito librerie di qualità comprovata come Vstr o Bstring, e poi studiarsene gli internals e scriversi le proprie per imparare.
Grazie a tutti per i suggerimenti Siete grandiosi
In molti forum se avessi chiesto le stesse cose mi avrebbero dato dell'ignorante , voi invece mi avete dato una grande mano !
Grazie veramente di cuore
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2014, 01:52   #36
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Prendendo un pò di vostri suggerimenti ho iniziato a cercare di mettere in pratica questa idea:

Lato Client:
- send comando (1byte)
- send dimensione dati (1byte)
- send dati (dimensione variabile)

Lato Server:
- recv comando (1byte)
- recv dimensione dati (1byte)
- recv dati (dimensione variabile)

una struttura lato server contenente :
- variabile comando
- variable lunghezza dati
- buffer dinamico contentente i dati
- variabile di stato

la variabile di stato pensavo di farla da 0 a 3 dove
0 attesa comando, 1 attesa dimensione dati , 2 attesa dati, 3 esecuzione comando (forse lo stato 3 è evitabile)

- Voi che dite sono troppe tre recv due delle quali usate per ricevere un byte per volta ?
- e anche la variabile lunghezza dati pensavo di inviarla sempre anche quando il campo dati contiene un dato di dimensione 0 cioè vuoto e quando il campo dati contiene 1 solo byte . Dite che è uno spreco ?
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2014, 08:49   #37
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La struttura sul server deve avere un'ulteriore variabile che conserva la lunghezza dei dati effettivamente ricevuti, perché il server deve rimanere nello stato "2 attesa dati" fino a quando i dati ricevuti raggiungono la lunghezza dati prevista.
Sul client vale lo stesso discorso, e non avendo il problema di dover gestire più connessioni puoi mettere la recv in un loop.
Lo stato 3 lo eviterei, quando i dati ricevuti raggiungono la lunghezza prevista puoi eseguire il comando e reimpostare lo stato zero.
Per me non c'è alcun motivo per non usare una recv per ogni dato.
La lunghezza dato la invierei sempre, in questo modo non c'è bisogno di controllare che tipo di comando è arrivato.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2014, 09:13   #38
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2056
Esatto la lunghezza dato pensavo proprio di inviarla sempre per quel motivo se no dovrei fare un doppio controllo sul comando.
E la variabile che hai detto mi ero scordata di scriverla XD

Io però lato server hi creato una struttura ad hoc per ogni client mentre lato client no.
Sulla serializzazione delle strutture non avendolo mai fatto mi incuriosisce , ma dovrei informarmi .
Lato client c'è una connessione UDP verso un altro client
Devo un attimo riflettere se mentre riceve ha bisogno anche di comunicare con l'altro client o no. In caso positivo devo gestire la recv per evitare il loop :/
Vedrò !

Inviato dal mio Galaxy Nexus utilizzando Tapatalk
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2014, 09:43   #39
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12646
Quote:
Originariamente inviato da van9 Guarda i messaggi
La dimensione a zero non è mai stata valida per lo standard - un compilatore (no estensioni ovviamente) che non emette un warning in questo caso è da buttare. La dimensione ad uno è legale, ma invoca undefined behavior quando vai ad accedere oltre il primo elemento e se le ottimizzazioni sono attive può accadere di tutto. La cosa giusta è "char variable_message[];" usando C99. Se C99 non è un'opzione si usa la dimensione ad uno ma è meglio controllare cosa combina il compilatore.

C and C++, where (almost) everything is not what it seems...
Ho provato su Debian 7 con GCC 4.7 e con i flag -Wall -Wextra non riporta nulla (non ho dovuto neanche passargli std C99).

Ora giusto per curiosità provo sulle ultime versioni di clang e Visual Studio 2013 .

Edit: neanche Visual Studio si lamenta (sempre abilitando tutti i Warning), sarà perché usa un compilatore C++.

Edit2: neanche llvm 3.4, sempre passando -Wall -Wextra.

In pratica possiamo buttare tutti i compilatori esistenti .

Ultima modifica di WarDuck : 05-07-2014 alle 09:54.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2014, 12:45   #40
nico159
Senior Member
 
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Ho provato su Debian 7 con GCC 4.7 e con i flag -Wall -Wextra non riporta nulla (non ho dovuto neanche passargli std C99).

Ora giusto per curiosità provo sulle ultime versioni di clang e Visual Studio 2013 .

Edit: neanche Visual Studio si lamenta (sempre abilitando tutti i Warning), sarà perché usa un compilatore C++.

Edit2: neanche llvm 3.4, sempre passando -Wall -Wextra.

In pratica possiamo buttare tutti i compilatori esistenti .
Devi usare -Wpedantic
Quote:
warning: ISO C++ forbids zero-size array ‘variable_message’ [-Wpedantic]
Issue all the warnings demanded by strict ISO C and ISO C++; reject all programs that use forbidden extensions, and some other programs that do not follow ISO C and ISO C++. For ISO C, follows the version of the ISO C standard specified by any -std option used.
__________________
In a world without fences, who needs Gates?
Power by: Fedora 8 - Mac OS X 10.4.11

Ultima modifica di nico159 : 05-07-2014 alle 12:48.
nico159 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Turtle Beach Vulcan II TKL Pro: una tastiera analogica senza compromessi Recensione Turtle Beach Vulcan II TKL Pro: una t...
SuiteWorld e CloudWorld: nel 2024 le parole d'ordine sono neutralità e apertura SuiteWorld e CloudWorld: nel 2024 le parole d'or...
Recensione Nothing Phone (2a) Plus: poco Plus ma è sempre più convincente Recensione Nothing Phone (2a) Plus: poco Plus ma...
Recensione HONOR MagicPad 2, con un meraviglioso OLED da 12,3'' è un vero affare Recensione HONOR MagicPad 2, con un meraviglioso...
Google Pixel Watch 3: migliora ma non è ancora come vorremmo. La recensione Google Pixel Watch 3: migliora ma non è a...
Ecco una friggitrice ad aria e grill 2-i...
Il miglior computer portatile per rappor...
I chip Wi-Fi e 5G Apple arriveranno nel ...
Tutte le offerte Google Pixel: Watch e s...
Aspirapolvere robot e scope elettriche i...
L'ONU propone un piano internazionale pe...
Nuki Smart Lock con supporto Matter e in...
Nuovi iPhone 16 e 16 Pro, AirPods 4 e Ap...
Amazon Seconda Mano (ex Warehouse): pros...
Microsoft Flight Simulator 2024: la conf...
Occhio agli sconti AVM FRITZ!Box nel wee...
Tutti gli sconti del weekend per il mond...
Questo portatile Lenovo con doppio SSD, ...
Questo robot aspirapolvere viene svendut...
I prodotti TOP nel weekend su Amazon: as...
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: 10:06.


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