swcratis Δημοσ. 23 Οκτωβρίου 2008 Δημοσ. 23 Οκτωβρίου 2008 καλησπερα!Ηθελα να ρωτησω το εξης:Εχω φτιαξει εναν server και εναν client αναμεσα στους οποιους γινεται η συνδεση μια χαρα.Σε καποιο σημειο στο προγραμμα του client υπαρχει ο εξης κωδικας που ζηταει απο τον client να εισαγει ενα αλφαριθμητικο και με την scanf > printf("dwse to onoma:"); scanf("%s",Apo); //pinakas orismenos global ετσι : char Apo[5]; write(sd,Apo,strlen(Apo)); Το sd ειναι ο int που επστρεφεται απο την κληση της socket μεσα στο client.Δηλαδη θελω απλα να στειλει ο cllient αυτο το αλφαριθμητικο στον server. Για τον server εχω το εξης: > read(ns,pinakas,strlen(pinakas)); printf("%s",pinakas[10]); char pinakas[5]; ns επιστρεφεται απο την accept. Που κανω λαθος?Πρεπει οι πινακες να εχουν το ιδιο ονομα? :confused:
warchief Δημοσ. 23 Οκτωβρίου 2008 Δημοσ. 23 Οκτωβρίου 2008 Καταρχάς τα sd και ns είναι τα socket descriptors, όχι οι πίνακες σε client και server δεν πρέπει να έχουν το ίδιο ονομα. Το πρόβλημα που είναι? Αν δεν σε πειράζει πόσταρε το κομματι του κωδικα που χειρίζεται την σύνδεση να δουμε τι έχεις κάνει.
fromaz Δημοσ. 23 Οκτωβρίου 2008 Δημοσ. 23 Οκτωβρίου 2008 Το read στον server σου είναι ...δυναμίτης. Ζητάς το strlen(pinakas) πριν ακόμη διαβαστεί! Κατά τα άλλα, ο server αγνοεί τι πρέπει να διαβάσει, συνεπώς θα πρέπει να τον βοηθήσεις. Ένας τρόπος είναι να προηγείται το μήκος του string: Client >int len = strlen(Apo); write(sd,&len,sizeof(int)); write(sd,Apo,len); Server >int len; read(ns,&len,sizeof(int)); read(ns,pinakas,len); Στην πράξη, βέβαια, τα πράγματα δεν είναι και τόσο απλά και κακώς - κατά τη γνώμη μου - ασχολείσαι με sockets όταν δεν έχεις ακόμη κατανοήσει τη γλώσσα επαρκώς. Για παράδειγμα, ορίζεις pinakas[5], και ζητάς εκτύπωση από pinakas[10]...
warchief Δημοσ. 23 Οκτωβρίου 2008 Δημοσ. 23 Οκτωβρίου 2008 Το read στον server σου είναι ...δυναμίτης. Ζητάς το strlen(pinakas) πριν ακόμη διαβαστεί! Κατά τα άλλα, ο server αγνοεί τι πρέπει να διαβάσει, συνεπώς θα πρέπει να τον βοηθήσεις. Ένας τρόπος είναι να προηγείται το μήκος του string: Client >int len = strlen(Apo); write(sd,&len,sizeof(int)); write(sd,Apo,len); Server >int len; read(ns,&len,sizeof(int)); read(ns,pinakas,len); Στην πράξη, βέβαια, τα πράγματα δεν είναι και τόσο απλά και κακώς - κατά τη γνώμη μου - ασχολείσαι με sockets όταν δεν έχεις ακόμη κατανοήσει τη γλώσσα επαρκώς. Για παράδειγμα, ορίζεις pinakas[5], και ζητάς εκτύπωση από pinakas[10]... Απο το manual της read θα δεις: ssize_t read(int fildes, void *buf, size_t nbyte); Κοινώς σου λέει, διάβασε απο τον fildes nbyte και γράψτα στον buf. Στον server λες read(ns,&len,sizeof(int)); Που σημαίνει διάβασε ισα με το μέγεθος (σε Bytes) ενός integer απο το socket και αποθηκευσέ τον στην μεταβλητή len. Σε αυτή την περίπτωση μιας και το len είναι integer, όλα καλά. Ακολούθως λες: read(ns,pinakas,len); Δλδ: διάβασε len Bytes απο το socket και αποθήκευσε τα στον pinakas. Στην περίπτωση που len > sizeof(pinakas) (αν ο πίνακας έχει οριστεί ως char pinakas), θα πάρεις ενα ωραιότατο buffer overflow συνοδευόμενο απο ενα ωραιότατο segmentation fault.
3c0r1z Δημοσ. 3 Νοεμβρίου 2008 Δημοσ. 3 Νοεμβρίου 2008 Για ρίξε μια ματιά εδώ: http://beej.us/guide/bgnet/output/html/multipage/index.html
delfini69 Δημοσ. 3 Νοεμβρίου 2008 Δημοσ. 3 Νοεμβρίου 2008 ΕΥΧΑΡΙΣΤΟΥΜΕ ΓΙΑ ΤΗΝ ΑΠΑΝΤΗΣΗ!!! ΑΝ ΚΑΙ ΝΟΜΙΖΑΜΕ ΠΩΣ ΜΕ ΤΕΤΟΙΟ NICK ΔΕΝ ΜΑΣ ΑΠΑΝΤΟΥΣΕ ΚΑΝΕΙΣ....
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.