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

[ تمت الإجابة ]سؤال فى الWinsock

مغلق
بدأه احمد غريب في 25 سبتمبر 2005 · 10 رد · 2,227 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤال مستعجل.

اقوم بعمل برنامج وتوقفت فى نقطة حرجه,,

اريد القيام بعمل سرفر يقبل اكثر من إتصال بإستخدم الدالة WSAAsyncSelect

قمت بعلم struct يحتوى على مجموعة من المتغيرات على النحو التالى..

CLIENTS struct 
	InUse BYTE 0
	ClientSock SOCKET <>
	ClientAddress sockaddr_in <> 
 	 dwThreadID DWORD 0        
 	 hThreadID HANDLE 0       
CLIENTS ends

ثم قمت بعلم array يحتوى على 10 عناصر من هذا الـstruct لاسمح بعشر إتصالات بالسرفر فى ان واحد..

طبعاً الدالة WSAAsyncSelect ترسل رسالة لوندوز عندما يحدث حدث فى الاتصال, مثلاُ عندما يريد الـClient ان يرسل او يتصل الخ

الان اريد ان اعرف هل يجب ان اقوم بعلم thread لكل Client ام ان هناك طريقة مختلفة للتعامل معى هذه الرسائل, بحيث استطيع التعرف على الـClient الذى تسبب فى ارسال الرسالة..

إذا كان لابد من عمل thread لكل Client ماذا يحدث للرسائل التى ترسل للنافذة الرئيسية ..

احاول منذ اربع ساعات ولم اجد حل لهذه المشكلة الغبية ....

الله المستعان

والسلام عليكم

تم تعديل هذه المشاركة بواسطة احمد غريب في 25 سبتمبر 2005 في 06:21

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#2

السلام عليكم

خلاص فرجت وجدت الحل...

CLIENTS struct 
	InUse BYTE 0
	ClientSock SOCKET <>
	ClientAddress sockaddr_in <> 
 	 hSocket HANDEL     
CLIENTS ends

بدل من ان اضح thead لكل client يكفى ان اضع مقبط فى الstruct وبذلك استطيع التعامل معى كل Client من خلال المقبض ولن احتاج لعمل thread ويمكننى الان تقليص حجم الstruct..

إن شاء الله بعد الانتهاء من البرنامج اشرح طريقة عمل client/server ولكن الان للاسف الوقت ضيق وحاسس إنه مقاس اخويا الصغير..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

الف مبروك :D

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

سؤال فضولي شوي اخي احمد

لماذا تستخدم الدالة WSAAsyncSelect ولم تستخدم الدالة select وهي الأفضل وتعمل على كل الأنظمة ؟

-

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#5

سؤال جميل اخى jaas بكل بساطة لانى لم اكن اعرف انها تستخدم فى الsocket الان اشوف إستخداماتها فى MSDN ربما تحل المشاكل إلى عندى..

ومازال الوقت يضيق ويضيق, وشكله حيخنقنى فى الاخر

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#6

السلام عليكم

مازالت لدى مشكلة ....

اريد القيام بعمل سرفر يستقبل اكثر من إتصال فى نفس الوقت قمت بعمل التالى

CLIENTS struct 
	InUse BYTE 0
	ClientSock SOCKET ?
	ClientAddress sockaddr_in <> 
	dwThreadID DWORD ?
 	 hThreadID HANDLE ? 
CLIENTS ends
.data?
Clients CLIENTS MAX_CONNECTS DUP (<?,?,,?,?>)

MAX_CONNECTS هى اقصى عدد إتصالات وهى من نوع const وتساوى 10

بعد ذلك اقوم بالتالى

InitSockStruct proc 
	mov ecx, 0
	loop1:
	mov eax, SIZEOF CLIENTS
	mul ecx 
	mov [eax+Clients.InUse], 0
	inc ecx
	cmp ecx,MAX_CONNECTS
	jl loop1  
	invoke  WSAStartup, 0202h, addr wsad

	ret

InitSockStruct endp

;---------------------------------------------------------------
listningSock proc 


	mov  sin.sin_family, AF_INET	
	invoke htons,port
	mov  sin.sin_port, ax
	mov  sin.sin_addr.S_un.S_addr, INADDR_ANY

	invoke	socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
	mov ListeningSocket,eax
	invoke bind, ListeningSocket, addr sin, sizeof sin
	invoke listen, ListeningSocket, 0Ah
	mov eax,ListeningSocket
	invoke WSAAsyncSelect, ListeningSocket, hwnd, WM_WSAASYNC1, FD_READ or FD_WRITE or FD_ACCEPT or FD_CLOSE
	ret

listningSock endp

الدالة الاولى تضع قيم إبتدائية لجميع العناصر فى المصفوفة, والثانية تقوم بعمل إتصال...

واخيراً اقوم بمعالجة الرسائل على النحو التالى

	.ELSEIF uMsg==WM_WSAASYNC1
  mov ax, word ptr [lParam+2]
  .IF ax==FD_READ
 	 invoke recv,wParam, addr data, sizeof data, 0
 	 mov sizeofdata,eax
 	 invoke MessageBox,hWnd,addr data,NULL,MB_OK
  .ELSEIF ax==FD_WRITE
  .ELSEIF ax==FD_ACCEPT
 	 mov ebx,current
 	 invoke accept ,wParam, addr Clients[ebx].ClientAddress,sizeof sockaddr_in
 	 mov ebx,current
 	 mov Clients[ebx].ClientSock,eax
 	 inc current
  .ELSEIF ax==FD_CLOSE
  
  .endif

عملية الاتصال تحدث كما ينبغى ولكن عندما ارسل نص من الclient لا يظهر, والسبب فى الغالب هو لان مقبض الclient غير صحيح ...

ماهو الحل ....

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#7

اخي احمد إذا كان هذا هو الكود فقط ,, فهو ناقص كثير

اولا انت تريد عمل اكثر من إتصال ,, في هذة الحالة يجب ان تستخدم الدالة ioctlsocket

لتحويل نوع socket إلى blockmode

وبعد ذلك يجب ان تستخدم الدالة select لقرائة كل socket بشكل منفصل وفي ثريد منفصل

-

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#8

السلام عليكم و رحمة الله

بالنسبة للدالة WSAAsyncSelect فهى تقوم بوضع ال socket فى ال nonblocking mode بصورة اوتوماتيكية لذلك لا داعى ان تفعل اى شئ اخر, الشئ الثانى , لا اظن ان هناك اى حوجة الى تعدد التشعبات, الا اذا كنت ترغب فى ارسال كميات من البيانات فى دفعة واحدة من غير اى رد من الكلاينت.

اظن انك ماشى فى الطريق الصحيح, لكن

بالنسبة لهذا الكود.

invoke WSAAsyncSelect, ListeningSocket, hwnd, WM_WSAASYNC1, FD_READ or FD_WRITE or FD_ACCEPT or FD_CLOSE
ret

انت لاتحتاج كل هذه الرسائل بالنسبة لل socket الذى فى حالة استماع

فقط

invoke WSAAsyncSelect, ListeningSocket, hwnd, WM_WSAASYNC1,  FD_ACCEPT or FD_CLOSE
ret

لكن الدالة select ليست الا ضياع للزمن فى مثل هذه الاحوال, و اظنها موجودة للتوافقية فقط.

لكن و الله عندها فائدة واحدة , فيمكن ان تفيد اذا اردت ان تتاكد من ان الدالة connect قد نجحت ام لا.

ولا اعرف لها اى استخدام مع هذه ال IO-Models الحديثة.

على كل الاحوال, WSAAsyncSelect و لاعتمادها على الرسائل العادية, يمكن ان تكون غير فعالة.

او ليست الخيار الامنثل اذا كنت تتوقع الكثير من الاتصالات و ال clients يمكن ان تستخدم بدلا منها

WSAُEventSelect لكن لاتمل من التشعبات التى تريدها :)

على كل حال, اظن انه من السهل كتابة مثل هذا البرنامج بالسى, لان الاسمبلى فى هذه الاحوال تزهج.

عندما تصل الى حل فى التقطيع الذى يحدث فى الارسال للبيانات, اى ارسالها فى دفهات كثيرة.

ياريت تطرح الكود عسى ان نستفيد منه

#9

السلام عليكم

قمت بترجمة برنامج من سى إلى اسمبلى يقوم بالمهمة التى كنت ابحث عنها وحبيت اضع البرنامج هنا لكى اسمع اراء وتعليقات وإذا كان فى طريقة لتحسينه..

لو اراد احد شرح البرنامج يوجد رابط فى اعلى الكود يمكنكم الاظلاع عليه لان فيه شرح البرنامج بالكامل, طبعاً برنامج الاسمبلى فيه بعض التغيرات لكى يتناسب معى الكود الاصلى ولكن التغيرات ماهى إلى اشياء بسيطه جداً يستطيع كل من يفهم قليل من الاسمبلى ان يستوعبها..

والسلام عليكم

winsock.zip

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#10

السلام عليكم

وجدت ايضاً كود لعمل إتصال بالشبكة ولكن السؤال كان باللغة الروسية وهذا هو ترجمة السؤال

اقتباس
الراجل يسال: هل من الممكن التعامل مع الsockets بحيث يكون هذا التعامل Asynchronously دون انشاء نافذة جديدة . يعني دون استخدام الResources و() CreatWidow و.. .اريد ان اتمكن من ذلك بحيث يدخل هذا(يقصد -بهذا- الاجراءت اللازمة لفعل ما يطلبه) في الprocedure بتاعي . انتهى كلامه

العنوان : استخدام الsynchronous sockets دون انشاء نوافذ

اتمنى ان اكون قد نجحت في ايصال المعلومة

معى الشكر الجزيل لخبير اللغة الروسية المعتمد رومانوف....

والمداخلة بالكامل تجدها على هذا الرابط

http://www.wasm.ru/forum/index.php/index.p...m=12&topic=8027

والسلام عليكم

تم تعديل هذه المشاركة بواسطة romanof في 2 أكتوبر 2005 في 03:03

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#11

السلم عليكم

الظاهر فى زحمة العمل اخطائت ووضع ملف اخر غير الملف الذى كنت اود طرحه,

ارجو المعذرة من كل من حمل الملف وهاهو الملف الذى كنت اريد تحميله...

server client asm.zip

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

هذا الموضوع مغلق.

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