السلام عليكم
لدي برنامج بلغة c به كود مثل هذا
CONFF=/var/www/config
اريد تعديله ليقرأ الملف من الانترنت مثل كذا
CONFF=http://www.myhost.com/config
مع الشكر
السلام عليكم
لدي برنامج بلغة c به كود مثل هذا
CONFF=/var/www/config
اريد تعديله ليقرأ الملف من الانترنت مثل كذا
CONFF=http://www.myhost.com/config
مع الشكر
تحتاج الى برمجة الشبكات هنا، ستحتاج الى ان تقوم بعمل Socket يرسل و يستقبل من خلال الـ HTTP لتقوم بهذه المهمة.
.Everyone has a dream
.I never thought that I would be the one I am on now
...No Pain No Gain
مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...
تعديل: مشرف قسم السى/سى++ من 2012.
حقيقا انا فى هذة الحالة أفكر فى حال بطريقة أكثر انتاجية ... ماذا لو استخدمت PHP او جافا او باثيون أليس أفضل؟
محمد عودة كتب:حقيقا انا فى هذة الحالة أفكر فى حال بطريقة أكثر انتاجية ... ماذا لو استخدمت 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.
أعتقد بدلا من أن تستخدم Socket ... ربما تستخدم عميل HTTP (بدلا من البرمجه في ال Transport Layer .... برمج في ال Application Layer )
هناك العديد من عملاء ال HTTP في ال c ...
أو يمكنك إستخدام هذه الطريقه البسيطه جدا ... و هي تنفيذ أمر يقوم هو بالإتصال نيابة عنك ...
system("curl http://www.myhost.com/config");* يلزمك تنصيب curl
تم تعديل هذه المشاركة بواسطة __Unknown في 29 سبتمبر 2012 في 16:08
XMasterrrr كتب:تحتاج الى برمجة الشبكات هنا، ستحتاج الى ان تقوم بعمل Socket يرسل و يستقبل من خلال الـ HTTP لتقوم بهذه المهمة.
هل تكتب مثال ولو مختصر لهذه العملية
لايلزمك إستخدام الـ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
رائع أخي مستوى راقي في لغة السي
+ هل يمكنك أن تحضر لنا درس عن ما فعلته الآن و تشرح لنا فيه طريقتك أو تزيد عليه قليلا ؟ وشكرا ![]()
أو تذكر لنا المصادر التي تعلمت منها فعل هذا ![]()

على لينكس 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
وصلت المعلومه شكرا لك
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المثال بسيط وأكثر الكود للتحقق من الأخطاء ولم أقم بتحسينه, من العصر وأنا أكتب فيه طلعت عيوني :(.
ماذا تقصد بهاضين السطرين أخي :
؟
#define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0500

لدي قالب جاهز ووضعت تلك الأسطر به مسبقا. الـ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
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…