C++ Sockets binary file transfer

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

C++ Sockets binary file transfer

Post by netharis » Sun Jun 15, 2008 2:37 am

Χρησιμοποιώ το 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
Last edited by netharis on Tue Jun 24, 2008 4:38 pm, edited 1 time in total.
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
User avatar
Bloody Mary
Venus Former Team Member
Posts: 1230
Joined: Thu May 10, 2007 6:52 pm
Academic status: Alumnus/a
Gender:

Re: Undefined reference @URLDownloadToFile()

Post by Bloody Mary » Sun Jun 15, 2008 1:19 pm

Από το error που σου βγάζει, χωρίς να ξέρω περισσότερα σχετικά με αυτό που θες να κάνεις, υποθέτω πως ψάχνει κάποιο άλλο κομμάτι κώδικα - είτε ξεχωριστό είτε άλλη συνάρτηση - που περιμένει να έχεις δημιουργήσει με το όνομα "URLDownloadToFile" ... Αφού προφανώς εσύ δε θες να δημιουργήσεις κάτι τέτοιο (λογικά το έχεις δει να υπάρχει κάπου και γι'αυτό το καλείς στη main σου) , κοίταξε μήπως δεν καλείς κάποια βιβλιοθήκη που σου χρειάζεται με το απαραίτητο include στην αρχή... Το πιο πιθανό είναι να φταίει κάτι τέτοιο.
Στείλε μας το άρθρο σου, βοήθησε να αναπτυχθεί
το portal με θέματα που σε ενδιαφέρουν!
Υπάρχουν 10 είδη ανθρώπων: Αυτοί που ξέρουν δυαδικό σύστημα και αυτοί που δεν ξέρουν.
User avatar
djsolid
Kilobyte level
Kilobyte level
Posts: 483
Joined: Thu Dec 02, 2004 7:36 pm
Academic status: Alumnus/a
Gender:
Location: Πετράλωνα
Contact:

Re: Undefined reference @URLDownloadToFile()

Post by djsolid » Sun Jun 15, 2008 1:41 pm

Επίσης δοκίμασε στο Path να βάλεις κάτι όπως C:\

@Bloody Mary : Νομίζω το κάνει με "#include <urlmon.h> "
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Re: Undefined reference @URLDownloadToFile()

Post by netharis » Thu Jun 19, 2008 10:27 pm

Σας ευχαριστώ παιδιά,
@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;
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
User avatar
cyberpython
Mbyte level
Mbyte level
Posts: 654
Joined: Wed Nov 21, 2007 8:18 pm
Academic status: Alumnus/a
Gender:
Location: Αθηνα
Contact:

Re: Undefined reference @URLDownloadToFile()

Post by cyberpython » Tue Jun 24, 2008 12:11 am

Το πιθανότερο είναι το πρόβλημα να το προκαλεί η strcat αφού ένας buffer που περιέχει ένα null byte (τιμή 0) θα της δώσει την εντύπωση οτι στο σημείο που βρίσκεται το null τελειώνουν τα δεδομένα (είναι σχεδιασμένη για χρήση με null-terminated strings). Καλύτερα να αποφεύγεις αυτές τις μεθόδους και να χρησιμοποιείς απ' ευθείας τη memmove()
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Re: Undefined reference @URLDownloadToFile()

Post by netharis » Tue Jun 24, 2008 4:37 pm

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
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
Post Reply

Return to “Προγραμματισμός”