ملاحظة في هده الدروس الأولي لن أضع الأكواد كاملة للتجريب فقط سأضع الشكل التقريبي لكيفية الإستدعاء والإستعمال الدوال الي أن نفهم الدوال .
نضرة حول Winsock Programming :
بكل بساطة Programming winsock يتطلب هده الخطوات:
- تهيئة winsock dll.
- انشاء socket.
- تحديد نمط العملية: blocking أو non-blocking .
- أتصال السوكت Connect the socket.
- عمل بعض العمليات كإرسال واستقبال البينات.
- غلق السوكت الدي أنشئناه.
- تحرير التهيئة.
سوف أشرح هده الخطوات بكل تفصيل.
تهيئة مكتبات السوكت Socket Library Initialization:
عليك أن تستدعي الدالة WSAStartup لكي تهيئ winsock dll قبل أن تستخدم أي دالة من دوال السوكت.
هده الدالة تأخد syntax التالي:
WSAStartup PROTO wVersionRequired:DWORD, LPWSADATA:DWORD
البرامترات Parameters :
wVersionRequried :يمتل اصدار السوكت الدي تريد استخدامه هده الأوقات هناك الأصدار 1 و 2 فقط .ادا أردت استخدام الأصدار 1 نضع هناك 101h وادا أردت الأصدار 2 نضع 200h .
lpWSADATA :مؤشر الي بنية من نوع WSADATA تستعمله الدالة لكي تضع فيه معلومات حول السوكت الدي يوجد بجهازك كالأصدار .
القيمة المرجعة Return Value:
أتناء نجاح عمل الدالة تسترجع قيمة من نوع NULL .وادا فشلت ترجع قيمة تدل علي نوع الفشل.
ويمكنك معرفة نوع الفشل بالدهاب الي كتاب winsock.hlp
لانك لن تستطيع استعمال أي دالة ان لم تنجح هده الدالة وبالتالي فلن تستطيع استعمال الدالة WSAGetLastError .
جميع الدوال التي ترجع قيم فانها تضع القيمة المرجعة في المسجل eax.
include c:\masm32\include\wsock32.inc
includelib c:\masm32\lib\wsock32.lib
.data
wsadata WSADATA <>
.code
start:
invoke WSAStartup, 101h,addr wsadata
.if eax!=NULL
;<An error occured>
...
.else
; <The initialization is successful. You may proceed with other winsock calls>
...
.endif
.....
end start
include c:\masm32\include\masm32rt.inc
includmasm32\include\masm32rt.inc
include c:\masm32\include\wsock32.inc
e c:\includelib c:\masm32\lib\wsock32.lib
هنا يتم استدعاء مكتبات Winsocket.لا تنسي استدعائهم.
masm32rt.inc يحتوي علي موجهات المجمع ك .386 …. ويتم فيه استدعاء بعض المكتبات المهمة والماكرو.
.if eax!=NULL
يعني ادا حدت خطأ يفعل كدي: ;<An error occured>
ادا لم يحدت أي خطأ … هنا سنضع دولنا فيما بعد:
.else
; <The initialization is successful. You may proceed with other winsock calls>
.endif
انشاء السوكت Socket Creation:
بعد أن نجح استدعاء الدالة WSAStartup علينا أن نبدأ بانشاء السوكت.
ولانشائها نستعمل الدالة دات syntax التالي:
socket PROTO af:DWORD, type:DWORD, protocol:DWORD
البرامترات Parameters :
af:وهي بينية العنوان وقيمة هدا النوع حاليا هو PF_INET
type:هو نوع السوكت كما تعرفنا سابقا ادا أردت النوع stream socket سوف تجعل قيمة هدا البرامتر التابتة SOCK_STREAM أما ادا أردت النوع الأخر فتضع SOCK_DGRAM .
protocol:ادا كان البرامتر af هو AF_UNSPEC فهنا تضع نوع البروتوكول الدي تريد وادا وضعت PF_INET فهنا نجعله 0.
القيمة المرجعة Return Value:
ادا فشلت الدلة فالقيمة المرجعة هي INVALID_SOCKET ويمكنك استعمال الدالة WSAGetLastError لمعرفة نوع الخطأ. وادا نجحت تكون القيمة المرجعة هي مقبض الوينسوكت الدي تم انشائه وسوف نستعمله في الدوال القادمة الأمر شبيه بمقبض النافدة.
ملاحضة يمكنك انشاء سوكت واحد في البرنامج وعليك الحفاء بالقيمة المرجعة لستعمالها لاحقا.
include c:\masm32\include\masm32rt.inc include c:\masm32\include\wsock32.inc includelib c:\masm32\lib\wsock32.lib .data? sock dd ? wsadata WSADATA <> .... .code start: .... invoke WSAStartup, 101h,addr wsadata .if eax!=NULL ;<An error occured> ... .else ; <The initialization is successful. You may proceed with other winsock calls> invoke socket,AF_INET,SOCK_STREAM,0 ; Create a stream socket for internet use .if eax!=INVALID_SOCKET mov sock,eax .else invoke WSAGetLastError ... .endif ... .endif ..... end start
قمنا بانشاء السوكت وتأكدنا من أنها نجحت وادا نجحت قمنا بنقل المقبض أو القيمة المرجعة الي المتغير الدي حجزناه mov sock,eax
ملاحضة2:
جميع الدوال التي ترجع قيم فانها تضع القيمة المرجعة في المسجل eax.
المرجو طرح تساؤولاتكم لكي أستفيد منها.وبالتوفيق.
في الدرس المقبل سوف نتعرف علي دالة تحويل نمط السوكت من blocking الي none-blocking
ألقي نضرة علي هدا الكود وحاول أن تتدكره وتفهمه.![]()
include c:\masm32\include\masm32rt.inc include c:\masm32\include\wsock32.inc includelib c:\masm32\lib\wsock32.lib .data? sock dd ? wsadata WSADATA <> .code start: invoke WSAStartup, 101h,addr wsadata .if eax!=NULL invoke MessageBox,0,0,0,0 .else invoke socket,AF_INET,SOCK_STREAM,0 ; Create a stream socket for internet use .if eax!=INVALID_SOCKET mov sock,eax .else invoke WSAGetLastError .endif .endif end start
لتحميل الدرس علي شكل كتاب اضغط هنا:
