Page 1 of 1

C++ Sockets binary file transfer

Posted: Sun Jun 15, 2008 2:37 am
by netharis
Χρησιμοποιώ το Dev-Cpp, και προσπαθώ εδώ και 2 ώρες να κάνω το συγκεκριμένο function να δουλέψει

Code: Select all

#include <windows.h>
#include <urlmon.h>
#pragma comment(lib, "urlmon.lib")

using namespace std;

int main()
{   
    URLDownloadToFile(NULL, "http://dias.aueb.gr/~p30xxxxx/images.rar", "images.rar", 0,  NULL);
    return 0;
}

Κατα το link, πετάει το εξής error
[Linker error] undefined reference to `URLDownloadToFileA@20'

Υπάρχει κάποια λύση, για να μην αναγκαστώ να δουλέψω με sockets; :smt022

Re: Undefined reference @URLDownloadToFile()

Posted: Sun Jun 15, 2008 1:19 pm
by Bloody Mary
Από το error που σου βγάζει, χωρίς να ξέρω περισσότερα σχετικά με αυτό που θες να κάνεις, υποθέτω πως ψάχνει κάποιο άλλο κομμάτι κώδικα - είτε ξεχωριστό είτε άλλη συνάρτηση - που περιμένει να έχεις δημιουργήσει με το όνομα "URLDownloadToFile" ... Αφού προφανώς εσύ δε θες να δημιουργήσεις κάτι τέτοιο (λογικά το έχεις δει να υπάρχει κάπου και γι'αυτό το καλείς στη main σου) , κοίταξε μήπως δεν καλείς κάποια βιβλιοθήκη που σου χρειάζεται με το απαραίτητο include στην αρχή... Το πιο πιθανό είναι να φταίει κάτι τέτοιο.

Re: Undefined reference @URLDownloadToFile()

Posted: Sun Jun 15, 2008 1:41 pm
by djsolid
Επίσης δοκίμασε στο Path να βάλεις κάτι όπως C:\

@Bloody Mary : Νομίζω το κάνει με "#include <urlmon.h> "

Re: Undefined reference @URLDownloadToFile()

Posted: Thu Jun 19, 2008 10:27 pm
by netharis
Σας ευχαριστώ παιδιά,
@Bloody Mary
Το συγκεκριμένο function είναι στο header urlmon.h..
@djsolid
Δοκίμασα, αλλα no luck..

Υποθέτω υπάρχει κάποιο πρόβλημα ασυμβατότητας του συγκεκριμένου library με τον mingw32 που χρησιμοποιεί το Dev. Θα δοκιμάσω να το κάνω compile σε VC++...

Εdit:
Τελικά αναγκάστηκα να δουλέψω με sockets, και αντιμετωπίζω το εξής περίεργο πρόβλημα.
Αφού έχει γίνει η σύνδεση στο server, στέλνω ένα GET αίτημα για μία εικόνα, δημιουργώ το buffer για το response καθώς και το χώρο για να το αποθηκεύσω.

Code: Select all

    char *buf = (char*)malloc(1024);//1k buffer
    char *response = (char *)malloc(65000);//65k για όλο το file
    int receivedTotal = 0;
    while((readBytes = recv(s, buf, 1024, 0)) > 0)
    {
        strcat(data, buf);//κάνουμε concatenation του buffer στο data
        memset(buf, 0L, 1024); //clear buffer
        receivedTotal += readBytes;
    }


Για κάποιο λόγο, ο αριθμός των bytes που γυρίζει η recv, δεν αντιστοιχούν σε όλα τα bytes που γράφονται στο buffer μου. Δηλαδή εάν μέσα στο loop, εισάγω τον αντίστοιχο κώδικα,

Code: Select all

    cout <<  "Bytes Received by recv(): " << readBytes << " || " << Bytes in buffer: " << strlen(buf) << endl;

Αρκετές φορές οι 2 αριθμοί διαφέρουν, με αποτέλεσμα να έχω data loss, διαφορετικά τελικά size(το data απο το size της εικόνας + το size του header), και σαφώς ένα αρχείο που όταν αφαιρώ τα headers, είναι corrupt..
Καμία ιδέα απο τους guru του φόρουμ; :-p

Εdit: Τελικά έφταιγε οτι η strlen σταματάει όταν δεί null χαρακτήρα...και προφανώς περνούσα λιγότερα bytes στo αρχείο αφού χρησιμοποιούσα strlen για το byte count στο fstream.
To πρόβλημα παραμένει όμως, αφαιρώ τα http header, και δεν μπορεί να ανοίξει το αρχείο. Οτιδήποτε σε ascii το διαβάζει κανονικά, τα binary δεν μπορεί να μεταφέρει.
Any help;

Re: Undefined reference @URLDownloadToFile()

Posted: Tue Jun 24, 2008 12:11 am
by cyberpython
Το πιθανότερο είναι το πρόβλημα να το προκαλεί η strcat αφού ένας buffer που περιέχει ένα null byte (τιμή 0) θα της δώσει την εντύπωση οτι στο σημείο που βρίσκεται το null τελειώνουν τα δεδομένα (είναι σχεδιασμένη για χρήση με null-terminated strings). Καλύτερα να αποφεύγεις αυτές τις μεθόδους και να χρησιμοποιείς απ' ευθείας τη memmove()

Re: Undefined reference @URLDownloadToFile()

Posted: Tue Jun 24, 2008 4:37 pm
by netharis
cyberpython wrote:Το πιθανότερο είναι το πρόβλημα να το προκαλεί η strcat αφού ένας buffer που περιέχει ένα null byte (τιμή 0) θα της δώσει την εντύπωση οτι στο σημείο που βρίσκεται το null τελειώνουν τα δεδομένα (είναι σχεδιασμένη για χρήση με null-terminated strings). Καλύτερα να αποφεύγεις αυτές τις μεθόδους και να χρησιμοποιείς απ' ευθείας τη memmove()

Eυχαριστώ, χρησιμοποίησα και τη memmove (με αντίστοιχη αύξηση του pointer κατα size_t bytes που λήφθησαν),
αφαιρώ τα http headers απο το τελικό αρχείο κάνω rename στο extension που θέλω αλλα και πάλι δεν ανοίγει η φωτογραφία...
Υπάρχει μήπως κάποιο θέμα encoding?

EDIT:
Ανοίγω το original αρχείο, και το κατεβασμένο σε Hex Editor, και παρατηρώ το εξής:
Στο κατεβασμένο αρχείο, πριν κάθε 0Α hex τιμή (LF) έχει τη τιμή 0D(το Carriage Return), η οποία δεν βρίσκεται στο original αρχείο, με αποτέλεσμα να αλλάζει θέση στις υπόλοιπες τιμές.
Για να το ελέγξω αυτό, πρέπει να χρησιμοποιήσω 1-byte buffer στη recv() και να ελέγχω τα διαδοχικά bytes, η υπάρχει κάποιος άλλος τρόπος; :smt017