Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-04-2008, 18:21   #1
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
[C] client/server per scambio file

Ciao a tutti ragazzi, ho un bisogno assoluto del vostro aiuto!
Devo implementare in C un client ed un server in modo che il client possa richiedere un file al server e quest'ultimo glielo invii.

Per iniziare mi sono studiato le socket... ok, ho scritto un client che si collega al server tramite indirizzo IP del localhost e il server gli rimanda a connessione avvenuta un messaggio di benvenuto "Hello Client", data, ora indirizzo IP del client, del server e le porte di "ascolto" della socket.

Bene, i due programmi comunicano correttamente usando le funzioni write/read...
ma dalle specifiche del progetto questo non è quanto richiesto.

Infatti mi viene detto che il client richiede il file al server tramite una chiamata del tipo:
GET /data/esempio.txt

e il server risponde con:
codice XXX parametro XXXXXXXXXXXXx
es.
codice: 201 parametro: PERMISSION DENIED
codice: 301 parametro: [dati del file]
ecc.

mi viene anche fornito il Protocollo seguente da rispettare come formato per ogni comando:
Message Length - 4 byte in ordinamento network
Message Code - 2 byte in ordinamento network
Message Parameter - potrebbe essere opzionale e le cui dimensioni dipendono dalle circostanze.

Quindi, mi sembra di capire che io NON devo implementare un semplice client/server ma qualcosa del tipo client FTP e server WEB.... giusto? o non ho capito un fiasco?

Poi ho letto che il protocollo http si basa per la trasmissione dei dati sul tcp/ip...
ok, MA come? quali sono le "chiamate" che devo usare?
se io decido di scrivere ogni comando nel formato dato (GET /../...) e poi con un banalissimo write lo passso alla socket e quando arriva al server lo faccio leggere e interpretare, e poi invio tramite una write del server la risposta al client...
ok, ci riesco, ma NON credo sia il modo giusto!
Non avrei bisogno di definire un protocollo e il "senso" di usare come istruzione GET (codice) (parametro) lo perdo, potrei usare "PRENDI" al posto di GET e non mi cambierebbe nulla......

come faccio in C ad usare le funzioni del protocollo http?
il "codice" del metodo GET dove piffero è definito?
come faccio ad usarlo?
E' qui che mi incarto e faccio confusione... c'è qualcosa che mi sfugge, lo sto cercando ma ancora niente...

AIUTOOOOOO!!!!!!!
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 00:40   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
se io decido di scrivere ogni comando nel formato dato (GET /../...) e poi con un banalissimo write lo passso alla socket e quando arriva al server lo faccio leggere e interpretare, e poi invio tramite una write del server la risposta al client...
Hai capito giusto. Quello che stai scrivendo è molto vicino alle prime versioni del protocollo HTTP.

Si scrive GET perché un giorno magari non ci sarà solo il tipo di richiesta GET, ma magari ci sarà anche POST o PUT (come in HTTP).
Quindi tu sul server devi controllare che il comando arrivi proprio con scritto GET
Quello che tu hai chiamato protocollo è solo il formato della risposta del server.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 10:05   #3
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Ciao Cionci, intanto grazie per la risposta... è già un inizio!

Ma visto che appunto GET, POST, LIST ecc sono "comandi" già definiti in http con le loro strutture dati, i loro codice e le loro funzioni...
Come posso integrarli nel mio programma in C?

Http usa TCP/IP e la socket che creo è appunto costruita usando la "grammatica" del tcp/ip.... quindi dovrei poter sfruttare il protocollo http, no?
Per fare un qualcosa che sia simile (anche se un po' alla lontana) ad un telnet, dove devo scrivere i comandi che voglio usare appunto rispettando una certa grammatica:
nomecomando, versione HTTP, ecc ecc.

non sai dove trovare un esempio di webserver scritto in C o un client (browser) scritto sempre in C da studiare?

Comunque, come inizio, adesso mi ci metto per implementare i camandi GET e LIST come anche tu mi hai consigliato, se poi a qualcuno viene in mente qualche suggerimento... Datemelo!!!!!
Per favore!!!!

Ciao
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 10:06   #4
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Sono super-ben-accetti anche link a tutorial, guide, dispense ecc.

Grazie
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 10:09   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Il testo non mi sembra che ti dica assolutamente di implementare un server http. Ti dice di implementare qualcosa di simile.

Non ci sono strutture dati in http, o meglio la struttura dati è definita da testo separato dai caratteri line feed e carriage return.

Se vuoi l'esatto funzionamento di http guardati la RFC corrispondente.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 10:33   #6
Rigo007
Member
 
L'Avatar di Rigo007
 
Iscritto dal: Oct 2001
Città: Trento
Messaggi: 164
Dai un occhio a un esempio TFTP scritto in C.
Altrimenti sul Stevens il titolo del libro è Unix Network Programming ne trovi un esempio già implementato che usa il protocollo UDP.
Rigo007 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 10:38   #7
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Ciao rigo007, si, lo stevens è proprio il manuale di riferimento che sto usando, adesso guardo l'esempio che mi hai segnalato.
Grazie

Cionci, ho scaricato il documento rfc2616, ci do una occhiata!

Ciao, a presto
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2008, 10:41   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
TFTP non è adatto, infatti si appoggia a UDP
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2008, 17:07   #9
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Ciao ragazzi!
allora, ho implementato la trasmissione dei messaggi a seconda dei vari casi...
adesso devo superare l'ultimo scoglio!

In caso di errori (file non esistente, sintassi sbagliata ecc) sono a posto.
L'ultimo caso, quello in cui il file c'è e lo si può prendere, come faccio a passare un file di dimensione qualsiasi su una socket?

Per chiarire, quando usavo le sistem call per implementare comandi linux, nel caso del cp aprivo un file e poi lo leggevo facendo mettere le info in un buffer di dimensioni fissate e ripetevo l'operazione fin quando la read non mi dava 0 (cioè file terminato)....

Ora, come posso fare una cosa simile con una socket?
E ancora, visto che i file normali in linux sono un flusso di byte non formattato e le info su COME interpretare tale flusso sono nell'inode... se "passo" il file tramite la socket su due pc diversi, perdo le informazioni dell'inode oppure no?
Ed infine che cosa vuol dire "passare file binari" (l'ho trovato a proposito del passaggio di file con FTP)?

Potete chiarirmi?
Grazie 1000000

PS per Cionci, quando avrò finito il progetto, posso postare il codice o è meglio di no ?

Comunque sono disponibile in pvt all'indirizzo email

Ultima modifica di cionci : 08-04-2008 alle 17:10. Motivo: tolta email in pubblico
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2008, 17:13   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Certo che lo puoi postare
Magari se è un esercizio di un qualche corso aspetta che ci sia stata la consegna.

Devi fare assolutamente la stessa identica cosa, leggi in un buffer parte del file e lo scrivi sul socket, continui fino a quando il file finisce.
Ovviamente devi scrivere anche gli header http, se stai implementando un server http.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 15:50   #11
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Ciao, ho ancora un problema...

Come posso impostare un "temporizzatore" su una socket?
In pratica, ho il mo server che gestisce più client e ogni client può chiedere di eseguire più comandi (è il client che chiude la socket quando processa il comando EXIT)....
Quello che devo ottenere, però, è che il server tenga traccia del tempo di connessione di ogni client e se uno o più di questi rimangono inattivi per 60 secondi, il SERVER deve chiudere la loro socket!!!

Potrei impostare un valore di alarm(60) e poi signal(SIGALRM, mio handler), dove alarm viene resettato a 60 sec ogni volta che viene ricevuto/eseguito un comando sulla socket....

Però quello che voglio sapere è se è possibile passare come argomento al mio signal handler non solo il codice del segnale SIGALRM ma ANCHE il mio socket descriptor in modo da poter chiudere la connessione all'interno del mio handler...

Oppure vorrei sapere se ci sono altri modi per definire un timeout allo scadere del quale chiudere automaticamente la socket


Ciao e grazie
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 16:31   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Prima di tutto come gestisci i client ? Usi la select per controllare che siano arrivati dati sul socket ? In tal caso è banale, ti salvi il timestamp dell'ultima ricezione (uno per ogni client ovviamente), dopo ogni esecuzione della select controlli che la differenza fra il tempo attuale ed il timestamp non sia superiore al tempo limite, se è superiore chiudi la connessione.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 16:48   #13
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
No, viste le richieste del profe seguo la prassi:

sockfd =sock
bind(sockfd)
listen(sockfd)
(SIGCHLD,SIG_IGN)

for ( ; ; )
new_sockfd = accept(sockfd)

if ( fork() == 0 )
{
//figlio
close(sockfd)
azioni del figlio
}
else
{
//padre
close (new_sockfd)
}
//ciclo nel for
}
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 10:39   #14
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Ciao ancora...
l'idea che mi sembra più praticabile è la seguente:
//nel server
definisco un alarm(60)
che viene reimpostato ogni volta che ricevo qualcosa dalla socket
se arrivo a 0 -> si genera il segnale SIGALRM
voglio definire un mio gestore per il segnale suddetto....

1) con signal (SIGALRM, miohandler)
non riesco a fare nulla di buono, perchè intercetto il segnale, mi chiama la funzione miohandler, ma dentro non ho nessun lvalue per il socket descriptor che vogli chiudere

2) allora sto pensando a sigaction
sigaction mi "passa" anche una struct sigaction che è fatta da diversi campi che sto cercando di trovare e capire...
Potrei usare uno di questi per "passare" alla funzione di risposta al SIGALRM il valore del mio socket descriptor?

Qualche idea?
Ciao, francesco
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 10:46   #15
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Perché non usi la select su ogni singolo socket ? In questo modo fai la recv solo quando hai dati disponibili e non rimani mai bloccato. Sinceramente bisognerebbe vedere come si comporta il socket in caso di arrivo di un segnale gestito.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 10:55   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fai qualche prova con la setsocketopt: http://linux.die.net/man/3/setsockopt
Come vedi SO_RCVTIMEO e SO_SNDTIMEO dovrebbero fare al caso tuo.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 11:07   #17
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Non uso select per due motivi uno buono e uno no:

quello no, perchè dovrei riadattare il codice che ho scritto io, ma anche quello che mi è stato dato come consegna, ciò presuppone studio, incubazione e realizzazione.
E anche se è bene studiare le varie possibilità offerte da C / Unix, in questo momento non ne ho il tempo (progetto da consegnare dopodomani)

quello buono...... non so perchè (mio lack di conoscenza) ma l'ho proposto al mio prof (dato che già mi avevi risposto ieri riguardo alla select) e LUI mi ha detto "lascia stare, non è così che ho pensato il progetto" .... .... .... .... ..... MAH!!!!!!!!!!!!!

Quindi mi ha fatto capire che (sempre LUI) vuole il gestore del segnale...
Quindi le mie conclusioni sono le seguenti:
1) metto alarm(60), signal(SIGALRM,miohandler)
e miohandler{exit(-1);}
così dovrebbe "uscire" dal processo figlio (che conteneva la socket) e quindi "chiudere la sock"
ma, sinceramente, come sistema MI FA SCHIFO!!!!

2) quello che avevo pensato è usare sigaction (me la sto guardando) che è un po' più potente...
in particolare sigaction mi passa nella sunzione il puntatore ad una struct sigaction che contiene a sua volta un puntatore ad una struct siginfo_t, tra i cui campi mi sembra esserci un:
int si_band /*band event*/
int si_fd /*file descriptor*/

e sto cercando di capire se sono campi che io posso "scrivere" dal mio main in modo da metterci dentro il file descriptor della mia socket..... tipo:
struct sigaction * siga;
siga->sa_sigaction->siginfo_t-> si_band/si_fd = sockfd;

ora, per vari motivi suppongo che la "grammatica" scritta sopra NON sia proprio esatta... però la mia idea è quella.
Così potrei avere DENTRO al miohandler l'lvalue per la socket e FINALMENTE potrei chiamare uno SHUTDOWN(sockfd, 2) che quanto meno mi chiude la socket e non fa brutalmente un exit del processo....


Che ne dici? Hai suggerimenti?
E' possibile fare quello che ho pensato o è una "perdita" di tempo?
Questo perchè come detto sopra devo consegnare domani ed è l'ultimo punto che mi manca


Ciao
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 11:12   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Purtroppo non sono molto esperto nella gestione dei segnali
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 11:14   #19
f.bandiera
Member
 
Iscritto dal: Apr 2007
Messaggi: 51
Non sapresti anche solodarmi un link ad un codice con qualche esempio (anche 1) dove sigaction viene usata?

Sto cercando ma non ne trovo....
f.bandiera è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2008, 11:26   #20
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
A quanto sembra quella struttura siginfo_t viene riempita a seconda del tipo di segnale gestito.
http://www.opengroup.org/onlinepubs/...sigaction.html
http://www.cact.unile.it/facilities/...apilsu153.html
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
Il mercato smartphone rallenta nel Q3 20...
Addio al Valve Index: fine della produzi...
Seggiolini auto i-Size da 0 a 12 anni in...
Amazon determina i prezzi di tutto il we...
Robot aspirapolvere ECOVACS in offerta s...
Bodywel F20PRO o DEEPOWER A5? Due fat bi...
Gli agenti AI non diventano pazzi, sono ...
Kenwood Chef XL 6,7L a 239€ su Amazon: u...
Sconto al check-out a sorpresa: Smart TV...
Prima guida con GAC Aion V: interni prem...
Gli investitori frenano su Anthropic: IP...
Il meglio di Amazon in 10 articoli: 1, 2...
OpenAI, un modello GPT-5.6 Sol ha usato ...
Google testa Ask Google Help: l'IA di Ge...
Apple aggiorna l'elenco dei prodotti obs...
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: 13:07.


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