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

برمجة winsocket الدرس #2

بدأه the inventor habib في 23 يوليو 2012 · 5 رد · 1,282 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ملاحظة في هده الدروس الأولي لن أضع الأكواد كاملة للتجريب فقط سأضع الشكل التقريبي لكيفية الإستدعاء والإستعمال الدوال الي أن نفهم الدوال .

نضرة حول 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

ألقي نضرة علي هدا الكود وحاول أن تتدكره وتفهمه.cool.gif

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

لتحميل الدرس علي شكل كتاب اضغط هنا:

http://www.4shared.com/office/zAqQU-Vt/_2___winsock.html

تم تعديل هذه المشاركة بواسطة the inventor habib في 23 يوليو 2012 في 17:44

4
#2

راااااااائع ، وكمان +1 الك

واصل ابداعك وانا اواصل +1 :lol:

موفق :happy: :happy:

556891961.gif

I am learning from you

it is the programmer eye

#4
اقتباس
wVersionRequried :يمتل اصدار السوكت الدي تريد استخدامه هده الأوقات هناك الأصدار 1 و 2 فقط .ادا أردت استخدام الأصدار 1 نضع هناك 101h وادا أردت الأصدار 2 نضع 200h .

بارامتر من نوع Word يستعمل لتحديد إصدار الـWindows Sockets، نحدد في البايت العلوي رقم الإصدار الثانوي (Minor) للـSocket و البايت السفلي نحدد فيه الإصدار الرئيسي (Major).

إصدارات الـ Windows Sockets:

Major.Minor | Value
    2.2     | 0202h
    2.1     | 0102h
    2.0     | 0002h
    1.1     | 0101h
    1.0     | 0001h
1
#5

شكرا علي الاضافة

#6

ترتيب رائع للأفكار .. شكراً لكـ

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