الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]قراءة ملف من الانترنت

بدأه x8. في 29 سبتمبر 2012 · 13 رد · 1,158 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي برنامج بلغة c به كود مثل هذا

CONFF=/var/www/config

اريد تعديله ليقرأ الملف من الانترنت مثل كذا

CONFF=http://www.myhost.com/config

مع الشكر

#2

تحتاج الى برمجة الشبكات هنا، ستحتاج الى ان تقوم بعمل Socket يرسل و يستقبل من خلال الـ HTTP لتقوم بهذه المهمة.

1

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#3

حقيقا انا فى هذة الحالة أفكر فى حال بطريقة أكثر انتاجية ... ماذا لو استخدمت PHP او جافا او باثيون أليس أفضل؟

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4
محمد عودة كتب:

حقيقا انا فى هذة الحالة أفكر فى حال بطريقة أكثر انتاجية ... ماذا لو استخدمت PHP او جافا او باثيون أليس أفضل؟

فى بعض الحالات يحتاج المبرمج الى استخراج بعد البيانات من الشبكة العنكبوتية و التلاعب عليها/بها من خلال برامج سطح المكتب و يتم اختيار لغة البرمجة المناسبة للمهمة المطروحة.

لاتستطيع فعل كل شئ مع PHP او بايثون، ربما جافا لكن نحن فى قسم السى++ :D

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#5

أعتقد بدلا من أن تستخدم Socket ... ربما تستخدم عميل HTTP (بدلا من البرمجه في ال Transport Layer .... برمج في ال Application Layer )

هناك العديد من عملاء ال HTTP في ال c ...

libcurl

chttpclient

أو يمكنك إستخدام هذه الطريقه البسيطه جدا ... و هي تنفيذ أمر يقوم هو بالإتصال نيابة عنك ...

system("curl http://www.myhost.com/config");

* يلزمك تنصيب curl

تم تعديل هذه المشاركة بواسطة __Unknown في 29 سبتمبر 2012 في 16:08

2
#6
XMasterrrr كتب:

تحتاج الى برمجة الشبكات هنا، ستحتاج الى ان تقوم بعمل Socket يرسل و يستقبل من خلال الـ HTTP لتقوم بهذه المهمة.

هل تكتب مثال ولو مختصر لهذه العملية

#7

لايلزمك إستخدام الـsocket والبدء من الصفر, بروتكول الـhttp معقد. توجد في ويندوز مكتبة WinInet وتوفر وظائف عديدة للتعامل مع الإنترنت والـhttp والـ,ftp, وهي التي يستخدمها IE.

مثال لتحميل صورة من الإنترنت وحفظها لسطح المكتب:

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <wininet.h> /* الملف الرأسي للمكتبة */

/* للربط مع المكتبة */
#pragma comment(lib, "wininet.lib")

INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    /* هوية المتصفح, جعلتها مثل هوية فايرفوكس */
    LPTSTR lpUserAgient = TEXT("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1");
    /* الملف الذي تريد تحميله */
    LPTSTR lpUrl        = TEXT("/uploads/profile/photo-231926.jpg");
    /* إسم ومسار الملف الذي تريد الكتابة إليه بعد تحميله من الإنترنت */
    LPTSTR lpFileName   = TEXT("C:\\Users\\Barakat\\Desktop\\mrb.jpg");

    HINTERNET hInternetInternetOpen;
    HINTERNET hInstanceInternetOpenUrl;
    BOOL bIsSuccessful;
    DWORD dwDataLenght;
    DWORD dwSizeofDataLenght = sizeof(dwDataLenght);
    BYTE *lbpDataBuffer = NULL;
    DWORD dwNumberOfBytesRead;
    HANDLE hFile;
    HANDLE hProcessHeap;

    /* هيئ متصفح الإنترنت */
    hInternetInternetOpen = InternetOpen(lpUserAgient, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

    if(hInternetInternetOpen == NULL) {
        MessageBox(NULL, TEXT("Error: InternetOpen"), NULL, MB_OK);
        return -1;
    }

    /* هيئ الإتصال بالصفحة */
    hInstanceInternetOpenUrl = InternetOpenUrl(hInternetInternetOpen, lpUrl, NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0);

    if(hInstanceInternetOpenUrl == NULL) {
        MessageBox(NULL, TEXT("Error: InternetOpenUrl"), NULL, MB_OK);
        InternetCloseHandle(hInternetInternetOpen);
        return -1;
    }

    /* إستخدمت هذه الوظيفة للحصول على حجم الملف */
    bIsSuccessful = HttpQueryInfo(hInstanceInternetOpenUrl, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwDataLenght, &dwSizeofDataLenght, NULL);

    if(bIsSuccessful == FALSE) {
        MessageBox(NULL, TEXT("Error: HttpQueryInfo"), NULL, MB_OK);
        InternetCloseHandle(hInstanceInternetOpenUrl);
        InternetCloseHandle(hInternetInternetOpen);
        return -1;
    }

    /* هيئت مساحة في الذاكرة بحجم هذا الملف */
    hProcessHeap = GetProcessHeap();
    lbpDataBuffer = (BYTE *) HeapAlloc(hProcessHeap, 0, dwDataLenght);

    if(lbpDataBuffer == NULL) {
        MessageBox(NULL, TEXT("Error: HeapAlloc"), NULL, MB_OK);
        InternetCloseHandle(hInstanceInternetOpenUrl);
        InternetCloseHandle(hInternetInternetOpen);
    }

    /* تحميل هذا الملف من الإنترنت */
    bIsSuccessful = InternetReadFile(hInstanceInternetOpenUrl, lbpDataBuffer, dwDataLenght, &dwNumberOfBytesRead);
    if(bIsSuccessful == FALSE) {
        MessageBox(NULL, TEXT("Error: InternetReadFile"), NULL, MB_OK);
        HeapFree(hProcessHeap, 0, lbpDataBuffer);
        InternetCloseHandle(hInstanceInternetOpenUrl);
        InternetCloseHandle(hInternetInternetOpen);
        return -1;
    }

    /***************************************************************/

    /* إنشئ ملف في سطح المكتب وإكتب ذلك الملف إليه */
    hFile = CreateFile(lpFileName, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE) {
            MessageBox(NULL, TEXT("Error: CreateFile"), NULL, MB_OK);
            HeapFree(hProcessHeap, 0, lbpDataBuffer);
            InternetCloseHandle(hInstanceInternetOpenUrl);
            InternetCloseHandle(hInternetInternetOpen);
            return -1;
        }

    WriteFile(hFile, lbpDataBuffer, dwDataLenght, &dwNumberOfBytesRead, NULL);

    CloseHandle(hFile);

    /***************************************************************/

    /* حرر الذاكرة وإغلق مقبض الصفحة ومقبض الإنترنت */
    HeapFree(hProcessHeap, 0, lbpDataBuffer);

    InternetCloseHandle(hInstanceInternetOpenUrl);
    InternetCloseHandle(hInternetInternetOpen);

    return 0;
}

إذا كنت تستخدم gcc قم بتصريفه هكذا :

gcc foo.c -lwininet

المثال بسيط وأكثر الكود للتحقق من الأخطاء ولم أقم بتحسينه, من العصر وأنا أكتب فيه طلعت عيوني :(.

تم تعديل هذه المشاركة بواسطة Mr.B في 29 سبتمبر 2012 في 20:02

2
#8

رائع أخي مستوى راقي في لغة السي smile.gif + هل يمكنك أن تحضر لنا درس عن ما فعلته الآن و تشرح لنا فيه طريقتك أو تزيد عليه قليلا ؟ وشكرا laugh.gif

أو تذكر لنا المصادر التي تعلمت منها فعل هذا smile.gif

rS3eY.png
#9
Mr.B كتب:

لايلزمك إستخدام الـsocket والبدء من الصفر, بروتكول الـhttp معقد. توجد في ويندوز مكتبة WinInet وتوفر وظائف عديدة للتعامل مع الإنترنت والـhttp والـ,ftp, وهي التي يستخدمها IE. مثال لتحميل صورة من الإنترنت وحفظها لسطح المكتب:

الف شكر لك ولجميع الاخوه

انا اتعامل مع لينكس

#10

على لينكس libcurl أفضل خيار كما أشار __Unknown . إذا كنت تستخدم أوبنتو , لم تذكر التوزيعة التي تستخدمها, نصب الحزمة التطويرية الخاصة بـlibcurl أولاً :

sudo apt-get install libcurl-dev

هذا مثال بسيط لتحميل صورة وكتابتها لملف :

#include <stdio.h>
#include <curl/curl.h>

int main(int argc, char **argv)
{
    CURL *curl; /* أنشئ كائن curl */
    CURLcode curl_error; /* لتعقب أخطأ curl */
    FILE *file;

    /* هيئ هذا الكائن */
    curl = curl_easy_init();
    if( curl == NULL ) {
        perror("Error: curl ");
        return -1;
    }

    /* أنشئ مقبض للملف الذي تريد الكتابة إليه وتأكد من تمرير wb كي يتمكن من الإضافة للملف */
    file = fopen("/home/barakat/mrb.jpg", "wb");
    if( file == NULL ) {
        perror("Error: fopen ");
        return -1;
    }

    /* ضع هوية المتصفح لأي متصفح تريد | ليس مهم  */
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1");
    /* هيئ رابط الملف الذي تريد تحميله */
    curl_easy_setopt(curl, CURLOPT_URL, "/uploads/profile/photo-231926.jpg");
    /* مرر مقبض الملف الذي فتحته للتو */
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
    /* مرر مؤشر للدالة التي ستستلم الملف لكتابته, إستخدم fwrite */
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);

    /* إبدأ ال تحمي ل وإطبع رسالة خطأ إذا لم تعد الدالة  صفر */
    if( (curl_error = curl_easy_perform(curl)) != 0 )
        printf("Error: %s\n", curl_easy_strerror(curl_error));

    /* حرر الكائن curl وأغلق الملف */
    curl_easy_cleanup(curl);
    fclose(file);

    return 0;
}

لتصريفه :

gcc foo.c -lcurl

ستجد كامل الدوال وشرحها هنا.

تم تعديل هذه المشاركة بواسطة Mr.B في 29 سبتمبر 2012 في 22:18

2
#11

وصلت المعلومه شكرا لك

#12
Mr.B كتب:

لايلزمك إستخدام الـsocket والبدء من الصفر, بروتكول الـhttp معقد. توجد في ويندوز مكتبة WinInet وتوفر وظائف عديدة للتعامل مع الإنترنت والـhttp والـ,ftp, وهي التي يستخدمها IE.

مثال لتحميل صورة من الإنترنت وحفظها لسطح المكتب:

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <wininet.h> /* الملف الرأسي للمكتبة */

/* للربط مع المكتبة */
#pragma comment(lib, "wininet.lib")

INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    /* هوية المتصفح, جعلتها مثل هوية فايرفوكس */
    LPTSTR lpUserAgient = TEXT("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1");
    /* الملف الذي تريد تحميله */
    LPTSTR lpUrl        = TEXT("/uploads/profile/photo-231926.jpg");
    /* إسم ومسار الملف الذي تريد الكتابة إليه بعد تحميله من الإنترنت */
    LPTSTR lpFileName   = TEXT("C:\\Users\\Barakat\\Desktop\\mrb.jpg");

    HINTERNET hInternetInternetOpen;
    HINTERNET hInstanceInternetOpenUrl;
    BOOL bIsSuccessful;
    DWORD dwDataLenght;
    DWORD dwSizeofDataLenght = sizeof(dwDataLenght);
    BYTE *lbpDataBuffer = NULL;
    DWORD dwNumberOfBytesRead;
    HANDLE hFile;
    HANDLE hProcessHeap;

    /* هيئ متصفح الإنترنت */
    hInternetInternetOpen = InternetOpen(lpUserAgient, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

    if(hInternetInternetOpen == NULL) {
        MessageBox(NULL, TEXT("Error: InternetOpen"), NULL, MB_OK);
        return -1;
    }

    /* هيئ الإتصال بالصفحة */
    hInstanceInternetOpenUrl = InternetOpenUrl(hInternetInternetOpen, lpUrl, NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0);

    if(hInstanceInternetOpenUrl == NULL) {
        MessageBox(NULL, TEXT("Error: InternetOpenUrl"), NULL, MB_OK);
        InternetCloseHandle(hInternetInternetOpen);
        return -1;
    }

    /* إستخدمت هذه الوظيفة للحصول على حجم الملف */
    bIsSuccessful = HttpQueryInfo(hInstanceInternetOpenUrl, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwDataLenght, &dwSizeofDataLenght, NULL);

    if(bIsSuccessful == FALSE) {
        MessageBox(NULL, TEXT("Error: HttpQueryInfo"), NULL, MB_OK);
        InternetCloseHandle(hInstanceInternetOpenUrl);
        InternetCloseHandle(hInternetInternetOpen);
        return -1;
    }

    /* هيئت مساحة في الذاكرة بحجم هذا الملف */
    hProcessHeap = GetProcessHeap();
    lbpDataBuffer = (BYTE *) HeapAlloc(hProcessHeap, 0, dwDataLenght);

    if(lbpDataBuffer == NULL) {
        MessageBox(NULL, TEXT("Error: HeapAlloc"), NULL, MB_OK);
        InternetCloseHandle(hInstanceInternetOpenUrl);
        InternetCloseHandle(hInternetInternetOpen);
    }

    /* تحميل هذا الملف من الإنترنت */
    bIsSuccessful = InternetReadFile(hInstanceInternetOpenUrl, lbpDataBuffer, dwDataLenght, &dwNumberOfBytesRead);
    if(bIsSuccessful == FALSE) {
        MessageBox(NULL, TEXT("Error: InternetReadFile"), NULL, MB_OK);
        HeapFree(hProcessHeap, 0, lbpDataBuffer);
        InternetCloseHandle(hInstanceInternetOpenUrl);
        InternetCloseHandle(hInternetInternetOpen);
        return -1;
    }

    /***************************************************************/

    /* إنشئ ملف في سطح المكتب وإكتب ذلك الملف إليه */
    hFile = CreateFile(lpFileName, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE) {
            MessageBox(NULL, TEXT("Error: CreateFile"), NULL, MB_OK);
            HeapFree(hProcessHeap, 0, lbpDataBuffer);
            InternetCloseHandle(hInstanceInternetOpenUrl);
            InternetCloseHandle(hInternetInternetOpen);
            return -1;
        }

    WriteFile(hFile, lbpDataBuffer, dwDataLenght, &dwNumberOfBytesRead, NULL);

    CloseHandle(hFile);

    /***************************************************************/

    /* حرر الذاكرة وإغلق مقبض الصفحة ومقبض الإنترنت */
    HeapFree(hProcessHeap, 0, lbpDataBuffer);

    InternetCloseHandle(hInstanceInternetOpenUrl);
    InternetCloseHandle(hInternetInternetOpen);

    return 0;
}

إذا كنت تستخدم gcc قم بتصريفه هكذا :

gcc foo.c -lwininet

المثال بسيط وأكثر الكود للتحقق من الأخطاء ولم أقم بتحسينه, من العصر وأنا أكتب فيه طلعت عيوني :(.

ماذا تقصد بهاضين السطرين أخي : confused_smile.gif ؟

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500
rS3eY.png
#13

لدي قالب جاهز ووضعت تلك الأسطر به مسبقا. الـWIN32_LEAN_AND_MEAN لتجاهل بعض الملف الرأسية h. وسريع بناء التطبيق, فقط لاتستخدمه إذا كنت تتعامل مع دوال الـsocket ودوال التشفير.

والـ_WIN32_WINNT لتحدبد أقل إصدار من ويندوز يدعمه برنامجك, 0x500 تعني ويندوز 2000 و 0x501 يشير لويندوز XP.فقط أستخدمه كي لأن بعض الدوال والبنى لايُمكن إستخدامها الا إذا عرفت هذا الـmacro فقد تجد في أحد الملفات الرأسية شيء مثل:

#ifdef _WIN32_WINNT
    #if _WIN32_WINNT > 0x400
        typedef struct _Foo Foo;
    #endif
#endif

فلايُمكنك إستخدام البنية Foo الا إذا كنت معرف _WIN32_WINNT وقيمته أكبر من 0x400.

إنظر لهذه الصفحة : http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx

تم تعديل هذه المشاركة بواسطة Mr.B في 5 أكتوبر 2012 في 21:47

1
#14

شكرا على التوضيح أخي smile.gif

rS3eY.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…