المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: ممكن مساعدة في ال WinSocket
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات لغات البرمجة العام > منتدى مبرمجي C و ++C و C++.NET > أرشيف منتدى قسم السي ++
DR-A
السلالالالالالالام عليكم
انا قاعد اخربط بين الـC++ و السي و و و و و
المهم
بغيت اعرف كيف اسوي كوننكت على سيرفر... يعني اتعلم كيف اسوي كونكت على اي شي. و كيف اسوي listen و send و recive و و و و و
يعني كل شي يتعللق بالـNetworking
المهم
كبداية سويت هالكود الفاشل هذا
[code2]
#include
#include


#define DEST_IP "64.212.171.241"
#define DEST_PORT 6667

void main()
{

int sockfd;
struct sockaddr_in dest_addr; // will hold the destination addr

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

dest_addr.sin_family = AF_INET; // host byte order
dest_addr.sin_port = htons(DEST_PORT); // short, network byte order
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset(&(dest_addr.sin_zero), '
هاني الأتاسي
هناك العديد من الأخطاء في هذا الكود صديقي ...

أولا : يجب عليك في البداية استدعاء التابع WSAStartup الذي يقوم بتحميل مكتبة ال Windsock أو Ws2_32.dll في الذاكرة ..

ومن ثم كان عندك خطأ في تعليمة ال printf ...!؟!؟!!؟!؟

ومن ثم لا تنسى اضافة المكتبة ws2_32.lib في خصائص المشروع كالتالي ..
إذهب إلى Project ثم Setting ..
اختر All configuration في ٍSettings for .
اختر المدخل Link على اليمين .
ثم أضف النص Ws2_32.lib إلى Object/library modules ..

الكود الجديد هو ...

[code2]
#include
#include


#define DEST_IP "64.212.171.241"
#define DEST_PORT 6667

void main()
{
SOCKET sockfd;
struct sockaddr_in dest_addr; // will hold the destination addr

WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
printf("could not find a usable WinSock DLL.n");
return;
}

__try {
sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

dest_addr.sin_family = AF_INET; // host byte order
dest_addr.sin_port = htons(DEST_PORT); // short, network byte order
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset(&(dest_addr.sin_zero), '
DR-A
أنتتتتتتتتتتت أثبت لي اني غبي (باني كتبت امر الـprintf غلط... ترى انا اعرفه لكني تسررعت والله)
و لأشياء ثانيه
المهم
أنا عاجز عن شكرك
و باذن الله أتعبك اكثر بأسألتي الأكثر
لكن ادري انه تعبي راحه
ههههههههههههههاهاهاهاهاهاهاهاهااااااا
معليه تحملني يا استاذ و ان شاء الله نتعلم على ايدك حبه حبه
أشكرك...... من القلب
teeth_smile.gif
هاني الأتاسي
مية السلامة .... regular_smile.gif
DR-A
أنا رجععععععععععععت
(((هاني الحين قاعد يضرب راسه بالكيبورد و يقول "لا لا لاااااا")))
معليه هاني يوم عليك و عشرة عليك teeth_smile.gif
مممممم
انا قعدت يوم كامل , او يوم و نص الين عرفت كيف اسوي أمر الـ Send و بعدها قلت أتعلم امر الـ Get ولاااااا عرفت
قلت طيب تعلم امر الـ Listen ولاااااا عرفت
قلت شوف يا ولد... مالك الا هاني و باقي الأعضاء هنااااا
المطلوب أبي احد يشرحلي كيف
1) أستقبل Get
2) أسوي Listen (احس ان هذي طويله)

ممممممم... و بس
أنا طيب و انا استاهل ... قصدي انت طيب و انا استاهل من وقتك شوي
ثنيكوووووو مقدماااا
teeth_smile.gif
هاني الأتاسي
أخي آسف على التأخير ..

سوف أعطيك لمحات بسيطة ولكن جدا مفيدة إلى أن ألاقي وقت أفصلك أكثر أو أحد من المنتدى يقوم بذلك عني أو أنت تقوم بذلك regular_smile.gif

أولا من أجل القيام بعمل برنامج شبكة . طيعا أنت تعلم أنت تحتاج إلى برنامجين واحد اسمه server سوضع في الجهاز المركزي . والآخر client وهو يوضع في الجهاز الطرفي ..

أيضا طبعا تحتاج إلى عنوان جهاز ال server مثلا رقم ال ip وال port المستخدم ..

بالنسبة لل client فإن الكود في الأعلى يقوم بعملية الربط مع ال server وتهيئة الجهاز الطرفي من أجل ارسال واستقبال البيانات .. يمكن أن تضيف وبكل سهولة تعليمات الارسال والستقبال إلى الكود في الأعلى وهم write من أجل الارسال و read من أجل الاستقبال .. هذان جدا متشابهان حيث تحدد قيمة ال socket المتوح ومؤشر إلى الذاكرة وعدد البايتات التي سوف تستخدمها ..
مثال :
[code2]
char buffer[250];

strcpy(buffer, "test);

write(sockfd, buffer, 250);

read(sockfd, buffer, 250);
[/code2]

بالنسبة لل server ..
تستخدم bind عوضا عن connect وذلك لفتح ال socket في السيرفر حيث bind تقوم بعمل socket طرف نهائي فقط أي في السيرفر فقط . أي لا تحدد رقم ال ip للجهاز الطرفي بل تحدد ال ip للجهاز نفسه ..
وبعد bind يجب أن ينتظر الserver من ال client ارسال أي من المعلومات وهذا الانتظار يتم عن طريق listen وهي مثل getch في السي أي لا ترجع قيمة حتى يتصل أحد ال client .. وبعدها تستخدم accept من أجل الموافقة على طلب ال client ومن ثم تستخدم read و write كما في السابق ...

وشكرا .. regular_smile.gif
fsl
مرحباً يا دكتور A
أنا أعرفك لكن انت ما تعرفني ..
اذا تبغى تتعلم برمجة الانترنت عليك بهذا الموقع
http://ms.cau.ac.kr/~cheree/project/NETWORK.html
لكن بصراحة أنصحك عموماً بالدلفي (بالانترنت وبغيره) لأنها أسهل وقوية بما فيه الكفاية
بمناسة الدلفي أذكر أن صديقك sadjackal قام بعمل برنامج server بسيط لم يستخدم فيه مكونات الدلفي الجاهزة ( مكتبة VCL) أو المكونات الاضافية وما قصر بالسطور التعليقية أكيد انك راح تستفيد منه
أعتقد أن هذه هي الوصلة
http://www14.brinkster.com/sadjackal/myserv.zip
DR-A
هانييي:
======
الكود اللي انت حطيته للارسال و الاستقبال صح وا اان غلطان؟؟
على العموم انتظر التفصيل الأكثر و أشكرك مقدماا

fsl :
====
الله يذكر ساد بالخير. و شكرا على الموقع... اما الدلفي فما عندي السيدي حقها و خلني اتعلم عليها بعدييييين teeth_smile.gif
هاني الأتاسي
دكتور A هيك خليت العالم يشمتو بلغة الفيجوال سي regular_smile.gif

استخدام ال Socket في ال MFC أسهل بكثير من استخدامها مباشرة عن طريق ال ٍSocket API على كل مافي أي مشكلة ...

وآسف إن كنت ذكرتلك التوابع read و write .. فهذه التوابع مستخدمة في ال Unix وأنا بزماناتي قرأت عن ال Socket في ال Unix ...

على كل كتبت برنامجين Client/Server للchat بسيطين وأشكر الأستاذ عادل خياطة لتجربته معي . وهما Console Application .. ويمكنك قرائة الشيفرة لهما وأن تسألي إذا كان في أي سؤال ..

طريقة العمل طبعا .. أن تضع الملف التنفيذي في السيرفر وتقوم بتشغيله .. ثم تقوم بتشغيل برنامج ال Client .. وسوف يتصل برنامج الكلاينت بالسيرفر عن طريق IP ..

طبعا بالكود سوف تجد في الأعلى ما يلي :
[code2]
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 6667
[/code2]

وهنا يجب أن تعين ال IP للسيرفر والبورت المستخدم في عملية ال Transfer .. ال IP الموجود حاليا في البرنامج هو locale أي محلي ، ومنه سوف يتم الاتصال بين البرنامجين في نفس الجهاز كما هو مبين في الصورة التالية ...


المشروع للبرنامجين موجود في الوصلة التالية :
http://arabteam.nicmatic.com/atassi/socket.zip

ومية السلامة ،
DR-A
رااااااااااااائع
شكككككككككككككككككككرا يا هاني البرنامجين قمممة بالروعه و مكتوبين بطريقة سهله الفهم
أشكرك مررة أخرى... و اسف اذا تعبتك لكني استفدت كثير
شكرا لك
DR-A
هانيييييييييييييييييي
كيفك؟ بخير صح؟ أدري... حتى انا..... دوم...
(ما بغيت افتح موضوع جديد... علشان ما يصير زحمه)
المهم خلينا ندخل على الموضوع
انا بغيت اسوي برنامج.. يشبك على سيرفر.... ينتظر الى ان يستقبل اي شيء ثم يرسل اوامر محده... طبعاً بالـMFC
أول شي اظغط CSock و حطيتها عند الـInclude للـDialog و رسمت زر و الكود له أو عمل الزر هو :
[code2]
void CTestDlg::OnButton1()
{
CSock* s = new CSock;
s->Create();
//s->Connect("64.212.171.241",6665);
s->Connect("127.0.0.1",8828);
}
[/code2]
و رحت عند الكلاس اللي اسمها CSock اللي هي للـCSocket اللي انا اظفتها و سميتها كذا و ظغطت باليمين و اخترت Add Virtual Function... ... و اخترت OnReceive و رحت كاتب
[code2]
void CSock::OnReceive(int nErrorCode)
{
CSock s;
s.Send("Nick DR-A_TEST_1nuser asd asd asd asdnJoin #GgGgGgn",100);
CSocket::OnReceive(nErrorCode);
}
[/code2]
<=----- يحسبها مثل الفيجوال بيسك sad.gif لا تظحك بكرة يتعلم و يصير احسن من بل جيت.... تتحدى؟؟ تشوف

و طبعا.. كالعاده.. باتت التجربه بالفشللللللللللللللللل
<=----- و يقول يبي يصير احسن من بل جيت... هههههههه خيال واسع

النعن استاذ هاني انا انتظر مساعدتك على أحر من الجمرررررررررررر.....
<=----- بيسوي ريفرش الين يلاقي رد جديد teeth_smile.gif
و ثنكيووووو مقدماا
DR-A
احححححح احححححححححححم
وينكمممم؟؟!!
Adel Khayata
السلام عليكم.
أعتذر عن التأخر عن الرد بسبب انشغالي بعض الشيء.
المشكلة في آخر شيفرة كتبتها هي أنك في التابع OnReceive قمت بتعريف متحول من نوع CSock جديد و كان يجب أن تستخدم نفس المتحول الذي عرفته من قبل و الذي أنت موجود في سياقه و بالتالي تصبح الشيفرة كالتالي :
[code2]
void CSock::OnReceive(int nErrorCode)
{
Send("Nick DR-A_TEST_1nuser asd asd asd asdnJoin #GgGgGgn",100);
CSocket::OnReceive(nErrorCode);
}
[/code2]
طبعاً يجب أن يكون هناك برنامج سيرفر يقوم بقبول عملية الاتصال و ارسال معلومة إلى ال Client حتى يتم استدعاء OnReceive .

و لتوضيح فكرة استخدام CSocket عن طريق MFC قمت ببناء برنامجين بسيطين يمثلان عملية ال Chat بين الطرف الأول و هو ال Server و الطرف الثاني و هو ال Client و المشروع للبرنامجين موجود في الوصلة التالية:
http://arabteam.nicmatic.com/atassi/CSocket.zip
وأود شكر الأخ هاني الأتاسي على مساعدته في تجريب البرنامج معي عن طريق الانترنيتregular_smile.gifregular_smile.gifregular_smile.gifregular_smile.gif
ملاحظة : ( طبعاً يمكن تجربة البرنامجين على نفس الجهاز و عندها يجب استخدام العنوان المحلي و هو 127.0.0.1 )
تسلسل تشغيل البرنامجين:
[list]
[*] نشغل برنامج ال Server و نحدد ال Port الذي نريد استخدامه و ثم نضغط على Create فيتم إنشاء ال Socket و يتم وضع ال Server في وضع الاستماع لأي محاولة اتصال على ال Port المحدد.
[*] نشغل برنامج ال Client و نضغط على Create لإنشاء ال Socket و طبعاً هنا لا نستخدم Port من أجل إنشاء ال Socket الخاص بال Client
[*] في برنامج ال Client نحدد عنوان ال Server و رقم ال Port الذي نريد الاتصال عليه ومن ثم نضغط على Connect .
[*] إذا كانت الأمور تسير على مايرام فستظهر رسالة في برنامج ال Server تشير إلى أنه تم قبول الاتصال من Client و يتم طباعة عنوان و رقم منفذ ال Client و تظهر رسالة في برنامج ال Client تشير إلى أن ال Server قد قبل الاتصال.
[*] لآن البرنامجين جاهزين لتبادل البيانات فيما بينهما و طبعأنكتب النص ثم نضغط على Send فيتم ارسال الرسالة إلى الطرف الآخر وطباعتها في كلا البرنامجين.
[*] يمكن في أي لحظة الضغط على Close من أجل إنهاء الاتصال.
وهذه لقطة من البرنامجين أثناء التشغيل:

هذا شرح عام عن كيفية تشغيل البرنامج أما عن شيفرة البرنامجين فأنا جاهز لأي استفسار.
مع التحيات.
DR-A
هيلووووو
أششششششششكرك على الشرح..... سههل علي أمور كثره..... و أشكرك أكثر على الوصله
هذه "نسخة - خفيفة" من محتويات الرئيسية للإستعراض الكامل مع المزيد من الصور والخيارات الرجاء إضغط هنا.
Invision Power Board © 2001-2009 Invision Power Services, Inc.