 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
[CURIOSITA'] Programmazione in C Clicca QUI per vedere il messaggio nel forum |
GinoPilotino |
ora che sono riuscito a fare i primi programmini cazzutissimi in tcp e udp in java volevo cercare di guardare qualcosina di c, giusto per capirci qualcosa.
nelle slides di cassiano ho visto che viene trattata la costruzione di una classe client e server in c.
la mia domanda è la seguente: a differenza di java, che ha una struttura completamente diversa tra TCP e UDP, per programmare con questi due protocolli in c basta sostituire il terzo parametro quando si crea la socket oppure c'è altro da fare? |
yeah |
Non ho sottomano le slide, potresti postare il pezzo di codice cui ti riferisci? |
GinoPilotino |
questo:
sd = (socket(AF_INET, SOCK_STREAM,0));
da quanto ho capito, gli ultimi due parametri indicano il tipo di protocollo da usare per la comunicazione; io intendevo dire:
per farla in tcp : (socket(AF_INET, SOCK_STREAM,6));
mentre per farla in udp: (socket(AF_INET, SOCK_DGRAM,17)); |
yeah |
ah ecco.
Dunque il terzo parametro lascialo pure su 0 (se non sbaglio determina una scelta automatica).
La differenza tra TCP e UDP la fai con SOCK_STREAM e SOCK_DGRAM. |
futurbaggio |
Originally posted by GinoPilotino
la mia domanda è la seguente: a differenza di java, che ha una struttura completamente diversa tra TCP e UDP, per programmare con questi due protocolli in c basta sostituire il terzo parametro quando si crea la socket oppure c'è altro da fare?
$> man socket
Giacchè hai Linux... :twisted:
Roberto |
GinoPilotino |
il problema è che sostituendo semplicemente i parametri della socket non funziona.
il server crea la socket e mi entra in loop infinito continuando a dire che sbaglia ad accettare il client.
qualcuno c'è riusciuto a farlo funzionare in udp? |
futurbaggio |
Originally posted by GinoPilotino
il problema è che sostituendo semplicemente i parametri della socket non funziona.
il server crea la socket e mi entra in loop infinito continuando a dire che sbaglia ad accettare il client.
qualcuno c'è riusciuto a farlo funzionare in udp?
Vedendo il codice sarebbe più facile...
Cmq se hai fatto una mera sostituzione dei parametri della funzione socket() (partendo da un codice in TCP) il problema risiede nella chiamata al metodo recv(), che non consente di identificare chi manda il pacchetto, quindi probabilmente il tuo server riceve e poi cerca di rispondere ma non può perchè nn ne sa abbastanza...
Questa è un'ipotesi, posta il codice e vediamo che succede.
Roberto
PS Una risorsa utile (gli esempi non sono facilissimi): http://netgroup.polito.it/reti2/sli...ni/sockets.html |
GinoPilotino |
eh si futur, il problema dev'essere proprio quello che dici tu.
ora però voglio prima cercare di capire alcune cose basilari del codice.
chi è in grado di tradurre cosa fa questa riga di codice???
client.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr))->s_addr;
e da dove escono fuori h_addr, e s_addr??? |
yeah |
Così a occhio dovrebbero essere variabili definite nel codice...
Comunque per usare UDP devi usare sendto() e recvfrom() |
GinoPilotino |
qualcuno è in grado di scrivere un codice TCP e UDP in c commentandolo come si deve? :? |
futurbaggio |
Originally posted by GinoPilotino
qualcuno è in grado di scrivere un codice TCP e UDP in c commentandolo come si deve? :?
Tu sei stato in grado di scriverlo, io sono in grado di commentartelo :twisted:
Roberto
PS Io ho fatto qualcosina in TCP, ma qua il problema è UDP: metti il codice! |
GinoPilotino |
Originally posted by futurbaggio
Tu sei stato in grado di scriverlo, io sono in grado di commentartelo :twisted:
Roberto
PS Io ho fatto qualcosina in TCP, ma qua il problema è UDP: metti il codice!
no, qua il problema di base è che noi non abbiamo mai visto il c, e di conseguenza programmare sia in tcp che in udp non è per niente facile.
le cose sono due:
- o uno decide di fare il pappagallo e s'impara a memoria il codice senza capirci una fava
- oppure uno cerca di capire cosa sono i puntatori ecc, cose a me personalmente non chiare.
quello che dicevo è se chi è capace di fare un programma in c (per sue conoscenze personali, non certo acquisite durante il nostro piano di studi) e in in grado di scrivere un codice commentato per bene. Personalmente non mi interessa leggere un commento tipo // ora creo la socket con sotto 5 o 6 righe di codice che utilizzano strutture a noi oscure con mille assegnamenti e parentesi ecc.
la mia non è una critica al corso; in java, linguaggio che m'hanno insegnato ad usare, ho imparato a fare qualcosina di programmazione di reti ma uno che non ha mai visto il c mi dici che cosa potrà mai capire da una riga di codice come quella postata da me in precedenza? |
futurbaggio |
Originally posted by GinoPilotino
la mia non è una critica al corso; in java, linguaggio che m'hanno insegnato ad usare, ho imparato a fare qualcosina di programmazione di reti ma uno che non ha mai visto il c mi dici che cosa potrà mai capire da una riga di codice come quella postata da me in precedenza?
Sicuro di esserci stato quando cassiano l'ha spiegato? Non si è certo dilungato ma mi pare che avesse (congiuntivo molto poco dubitativo) spiegato passo passo quella stessa riga di codice, che è di sicuro la più incomprensibile tra tutte...
Rinnovo cmq l'invito a mettere il tuo codice (se nn l'hai fatto dimmelo che smetto di chiederti), altrimenti dovrai aspettare che lo faccia io ma questo avverrà dopo che avrò consegnato la relazione di diritto...
Roberto
PS Hai visto il link che ho postato? |
GinoPilotino |
dopo diritto posto tutto il codice. :) |
Voodoo |
Salve gente,come da consiglio di yeah,visto che sono ancora al momento uno Winzozziano ( :D ),ho scaricato MinGW...
Volevo esser sicuro di averlo installato bene,perchè scrivendo un codice preso pari pari da una guida al C,l'applicazione mi si impalla...Ecco il codicillo simplizissimus:
code:
#include <stdio.h>
char *string = "Rosso\n";
int main(int argc, char *argv[])
{
printf(string);
*(string+3) = 'p';
printf(string);
}
Ora...io nn ho messo alcuna variabile ambiente perchè mi sembrava nn fosse richiesto...la compilazione va a buon fine,ma l'esecuzione si blocca all'atto dell'assegnazione del carattere.
Mi sapete dire perchè?
Ciao Grazie |
UZI |
Originally posted by Voodoo
Salve gente,come da consiglio di yeah,visto che sono ancora al momento uno Winzozziano ( :D ),ho scaricato MinGW...
Volevo esser sicuro di averlo installato bene,perchè scrivendo un codice preso pari pari da una guida al C,l'applicazione mi si impalla...Ecco il codicillo simplizissimus:
code:
#include <stdio.h>
char *string = "Rosso\n";
int main(int argc, char *argv[])
{
printf(string);
*(string+3) = 'p';
printf(string);
}
Ora...io nn ho messo alcuna variabile ambiente perchè mi sembrava nn fosse richiesto...la compilazione va a buon fine,ma l'esecuzione si blocca all'atto dell'assegnazione del carattere.
Mi sapete dire perchè?
Ciao Grazie
questo fatto mi ha incuriosito, allora mi sono messo ad indagare. alla fine, non so bene perchè ma questa versione del programma funziona.
code:
#include <stdio.h>
char s[] ="Rosso\n";
char *string = s;
int main(int argc, char *argv[])
{
printf(string);
*(string+3) = 'p';
printf(string);
return 0;
}
ora, il problema era proprio l'assegnamento del carattere che provocava un SIGBUS (un tipo di segnale di errore UNIX).
secondo me, ma è solo un'idea mia, il problema è che nella prima versione si assegnava al puntatore string sì il puntatore al primo carattere di "Rosso/n", ma il fatto è che questa stringa è dichiarata come costante, per cui evidentemente un accesso in memoria del tipo *(string+3) nè tantomeno la scrittura in quell'area non sono consentite. nella versione che ho postato, "Rosso/n" è assegnata ad una variabile array, quindi un'area di memoria scrivibile. Credo sia questo il problema, ma non sono un guru di C !
cmq non è un problema dell'installazione del programma MinGW, dato che ho provato il tutto su un apple con OSX utilizzando sia il compilatore di xcode che gcc, e su entrambi non funzionava. |
DeepBlue |
Originally posted by UZI
ma il fatto è che questa stringa è dichiarata come costante
mmm
Più o meno :)
Leggete qui: http://www.eskimo.com/~scs/C-faq/q1.32.html
per cui evidentemente un accesso in memoria del tipo *(string+3)
No, calma :)
In lettura puoi benissimo accedere a quella zona di memoria. Infatti questo:
code:
#include <stdio.h>
char *string = "Rosso\n";
char p;
int main(void)
{
p = *(string+3);
printf("%c", p);
}
funziona benissimo :) |
yeah |
Non so cosa stabilisca lo standard a riguardo, ma ricordo anche io che una stringa usata in quel modo dovrebbe risultare costante.
Stranamente, il compilatore del Visual C++ non la pensa allo stesso modo e il codice compilato con esso funziona perfettamente :)
Io suggerirei cmq di usare
char string[] = "Rosso\n";
così sei sicuro che puoi scriverci e leggerci senza problemi :) |
UZI |
Originally posted by DeepBlue
mmm
Più o meno :)
Leggete qui: http://www.eskimo.com/~scs/C-faq/q1.32.html
No, calma :)
In lettura puoi benissimo accedere a quella zona di memoria. Infatti questo:
sì beh mi sono espresso male in effetti... ma non è sempre facile esprimersi con parole proprie, il fatto è che quanto ho postato è quello che ho dedotto nella mia mente ignorante, non avendo trovato dei documenti, tipo quello postato da te, che ne parlassero.
cmq il discorso rimane incentrato su quell'assegnamento bastardo: nella prima versione il puntatore punta ad una costante stringa, nella seconda prima si inizializza un array (che è una variabile, quindi scrivibile) e poi gli si punta il puntatore.
secondo questa logica, il ragionamento non fà una grinza, ma a quanto dice yeah ora con visual c++ il codice funziona... mah :? |
DeepBlue |
Originally posted by UZI
ondo questa logica, il ragionamento non fà una grinza, ma a quanto dice yeah ora con visual c++ il codice funziona... mah :?
Il compilatore del VC++ non è gcc :) |
UZI |
Originally posted by DeepBlue
Il compilatore del VC++ non è gcc :)
sì ma diamine non è una differenza da poco!!! cioè, è come se vcc non proteggesse adeguatamente le costanti... ci saranno pure degli standard a riguardo! |
yeah |
Personalmente non trovo scorretto il comportamento di vc++: quando viene dichiarato il tutto, in qualche modo il programma indica una porzione di memoria in cui ci sono alcune lettere contigue.
Tale memoria appartiene al processo come quella di qualsiasi altra variabile (per lo meno globale e locale al blocco di codice in esecuzione) e dovrebbe essere scrivibile senza problemi.
La cosa che mi è strana è che l'errore lo da in runtime, non in compile time... boh :) |
UZI |
Originally posted by yeah
Personalmente non trovo scorretto il comportamento di vc++: quando viene dichiarato il tutto, in qualche modo il programma indica una porzione di memoria in cui ci sono alcune lettere contigue.
Tale memoria appartiene al processo come quella di qualsiasi altra variabile (per lo meno globale e locale al blocco di codice in esecuzione) e dovrebbe essere scrivibile senza problemi.
La cosa che mi è strana è che l'errore lo da in runtime, non in compile time... boh :)
mah, io invece trovo più corretto il comportamento di gcc... ok che la costant si trova nell'area di memoria del programma, ma per definizione non dovrebbe essere scrivibile! cioè, non è una variabile, e ad un programma non dovrebbe essere concesso di scrivere in aree di memoria che non siano variabili (a meno che si voglia programmare qualcosa di 'malizioso').
per l'errore in runtime è proprio il compilatore del linguaggio c che è piuttosto 'di manica larga' e lascia al programmatore l'onere di fare attenzione a quello che fà, in molti casi (quello più noto è la scrittura in array con sconfinamento dell'indice: il compilatore lo permette ma poi quando fai girare il programma dà errore, o addirittura crasha tutto il sistema operativo).
la cosa interessante da notare è che sulla stessa architettura, due compilatori c diversi generano codice macchina diversi... |
Voodoo |
Beh,grazie ragazzi,sono veramente commosso per tutto l'interessamento dimostrato per quel programmino,quel "coso" innocente... :D
Mi avete reso un bambino felice :D :D :D |
|
|
|
|