Προς το περιεχόμενο

Προγραμμα να κατεβαζει αρχεια απο Web Server


datanet

Προτεινόμενες αναρτήσεις

Δημοσ.

:shock: Θελω να φτιαξω ενα προγραμμα που να κατεβαζει αρχεια απο Web Server, κατι απλουστερο απο Getright. Πιστευω οτι θα συνδεεται στο server, port:80, και θα κανει GET /a.html HTTP/1.1, και ο server θα του στελνει το αρχειο. Εκανα κατι τετοιο αλλα δεν πετυχαινει.

Μηπως δεν ειναι τοσο απλο? :?:

Δημοσ.
;) Φαντάζομαι ότι δουλεύεις με sockets . Το δοκίμασα και εγώ αλλά δεν λειτουργεί . Κάτι παραπάνω βασικά θα θέλει. Η σύνδεση με το socket πραγματοποιείται επιτυχώς ;
Δημοσ.

Λοιπόν έχουμε και λέμε : ( υποθέτω ότι δουλεύετε σε Windoze και C/C++)

 

Βήμα πρώτο : Αρχικοποίηση του Winsock

Βήμα δεύτερο : Δημιουργία socket

Βήμα τρίτο : connect στην πόρτα 80

Βήμα τέταρτο : Υποβολή αίτησης .

Βήμα πέμπτο : λήψη του αρχείου

 

Λοιπόν τα πρώτα 3 βήματα είναι τετριμένα . Αυτό που αξίζει να σχολιάσω είναι η υποβολή της αίτησης . Το πρωτόκολλο HTTP ορίζει πολλά πεδία/εντολές τα οποία χρησιμοποιεί ο agent για να υποβάλει μία αίτηση σε κάποιον server .

πχ αν κάποιος θέλει να κατεβάσει μία σελίδα και θέλει να πάρει κείμενο φωτογραφίες εικόνες κτλ πρέπει να εμπεριέχει εκτός από την εντολή GET και την εντολή Accept :

 

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

 

Αυτές οι "εντολές" αποκαλούνται tags και ορίζονται από όλα τα RFC που σχετίζονται έμμεσα ή άμμεσα με το πρωτόκολλο HTTP . Όταν λοιπόν τώρα θα πατήσω εγώ click για να ποστάρω την απάντηση μου η εντολή που υποβάλλει ο browser στον server είναι κάτι σαν και αυτό ( καλά στην συγκεκριμένη περίπτωση είναι πολύ διαφορετικό λόγω php αλλά λέμε τώρα ..... ) :

 

 

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Accept-Language: el

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Host: 145.12.34.123

Connection: Keep-Alive

Cache-Control: no-cache

POST /kapou HTTP/1.1

 

 

Τα διαφορετικά πεδία χωρίζονται μεταξύ τους με CRLF ( carriage return / line feed ) ενώ το τελευταίο ΤΑG πρέπει να ακολουθείται απο ΔΥΟ CRLF

για να υποδηλώνεται ότι η εντολή τελείωση και δεν ακολουθούν άλλα πεδία.Επίσης αν κάποιο πεδίο παραλείπεται το πρωτόκολλο χρησιμοποιεί το default. Δεν είναι απαραίτητα όλα τα πεδία

 

Συνεπώς εσείς στο πρόγραμμα σας αν θέλετε να κατεβάσετε το αρχείο ας πούμε to XXX.html από εκεί που έχετε συνδεθεί θα πρέπει να στείλετε μέσω του send τον buffer o οποίος θα περιέχει (ακριβώς όπως σας δείχνω ) το string :

 

"GET /ΧΧΧ.html HTTP/1.0 \r\n\r\n"

 

Προσέξτε το τέλος του string .... είναι τα δύο CRLF που σας είπα πριν ...

 

Τώρα πως λαμβάνετε το αρχείο ....

 

Όπως καταλαβένετε δεν θα λάβετε το αρχείο ολόκληρο με το πρώτο recv αν το τελικό πακέτο που είναι payload+HTTP Header+IP header είναι μεγαλύτερο από το MTU του δικτύου . Για αυτό τον λόγο πρέπει να κάνετε το εξής . Θα διαβάζετε συνέχεια μέχρι να μην σας στέλνει ο server άλλα bytes στο socket , κάπως έτσι :

 

do

{

bytesRead = recv(socket, buffer, sizeof(buffer), 0);

fwrite(buffer,sizeof(char),bytesRead,fp);

} while(bytesRead!=0);

 

 

Για οποιεσδήποτε άλλες απορίες διαβάστε τα RFC . ( Δεν υπάρχει κάτι που δεν υπάρχει εκεί !!!! ) .

Δημοσ.

παιδιά, έχω κάτι έτοιμο σε Delphi, αλλά θέλει αρκετό ψάξιμό για να καταλάβεις τι παίζει, βασίζετε σε API των Windows...

 

Αν θέλετε, μπορώ να σας στείλω το unit με κάνα mail ή να το postαρω εδώ, αλλά είναι κομματί σκληρό...

Δημοσ.

ΟΚ, απλά να προτείνο κάτι.

 

Αν δουλέυετε με C/C++ σε περιβάλλον Windows, τότε μπορεί να χρησιμοποιήσετε το WinInet API, το οποίο είναι ένα επίπεδό πάνω από τα sockets.

  • 2 εβδομάδες αργότερα...
Δημοσ.

:shock: Ρε παιδια, πετυχαινει ...και ο webserver στελνει το αρχειο, αλλα αμα ειναι πανω απο π.χ. 40KB τοτε δεν παιρνει καποια τελευταια Bytes. Π.χ. 36 KB απο 40 KB, 416KB απο 422KB. Μου βγαζει ενα λαθος...που απο οτι καταλαβαινω μαλλον εγινε disconnect. Τι λετε να φταιει? Πως μπορω να πω εγω ποτε θα γινει το disconnect.?

:(

Δημοσ.

Θα ελεγε ότι στο loop που δέχεσαι τα πακετα, χάνεις το τελευταίο. Πρόσεξε, λογικά το τελευταίο πακέτο δεν έχει το ίδιο μέγεθος με τα προηγούμενα αλλά μικρότερο...

 

Καλή επιτυχία

Δημοσ.

το υλοποιησα σε VB6.0 και επειδη εβλεπα συνεχεια το μεγεθος των πακετων που ερχοταν, δεν εχει νοημα να το προσεχω αυτο γιατι ειναι σε καθε πακετο επαιζε το μεγεθος.

Βεβαια ειναι μικρο οπως λες......

...κατι αλλο παιζει! Καμια φορα ειναι ΟΚ και καμια φορα μπαρουφες....!

Μηπως να τα παρατησω και να παω για κανα χειροφρενο!!!!! :D :D :D :D

Δημοσ.

Είχα υλοποιήσει κάτι παρόμοιο παλιότερα.Είχα κάνει ένα POP client σε UNIX περιβάλλον σε C.

To μυστικό εδώ ειναι το RFC.Eκεί μέσα τα λέει όλα.

 

Επίσης όποιος ενδοιφέρεται για socket programming στην C σε περιβάλλον UNIX ασ διαβάσει αυτό, ίσως το καλύτερο στο internet:

 

http://www.ecst.csuchico.edu/~beej/guide/net/html/

 

bye bye

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...