بعض العمليات علي الSocket:
هناك نوعان من العمليات التي يمكن التعامل معها في الSocket عملية الارسال والاستقبال.وسوف أشرح كل واحدة علي حدة.
ارسال البينات الي Remote Socket:
نستعمل الدالة send لكي نرسل البينات في stream socket وأما في النوع datagram socket فالدالة المستخدمة هي sendto وانا لن أشرح النوع datagram socket لقلة استعمالها وكترة استعمال stream socket في HTTP والبروتوكولات التي نستعملها بكترة.
send لديها الشكل التالي:
send PROTO socket:DWORD, buffer:DWORD, len:DWORD, flags:DWORD
البرامترات:
- socket:هي مقبس الSocket الدي نتعامل معه أو الدي أنشئناه.
- buffer:عنوان البينات التي تريد ارسالها ولا يشترط أ، تنتهي ب '\0' أو NULL-terminated لانك سوف تحدد مقدار البينات التي سترسل.
- len:حجم البنات التي تريد ارسالها.
- flags:تسعمل لتحديد كيفية تصرف االدالة وعادة تكون قيمة هدا البرامتر 0.
القيمة المرجعة:
ادا فشلت الدالة تكون القيمة المرجعة SOCKET_ERROR وتضع في المسجل eax وادا نجحت تكون القيمة المرجعة عدد البيتات التي أرسلت.
كود توضيحي:

شرح السطر:
- بدابة مقطع البينات.
- حجز مكان في الداكرة بحجم 100 بايت.
- هناك يتم وضع اكواد أخري متل دالة انشاء السوكت أو أن تقوم بملئ buffer يعني البينات التي تريد أن ترسلها....
- بداية مقطع الكود.
- -----
- استدعاء دالة الارسال.
- التحقق من القيمة المرجعة ادا فشلت الدالة ...
- نضع هناك ما نريد فعله أتناء فشل الدالة.
- ادا ما نجحت الدالة .
- نضع ما نريد هناك ادا نجحت الدالة.
- نهاية الشرط.
قرائة البينات من الSocket:
هناك دالتين كدلك للستقبال البينات من Socket هناك recv الخاصة بstream socket و recvfrom الخاصة بdatagram socket.
recv تأخد Syntax التالي:
recv PROTO socket:DWORD, buffer:DWORD, len:DWORD, flags:DWORD
البرامترات:
socket:هي مقبس الSocket الدي نتعامل معه أو الدي أنشئناه.
القيمة المرجعة:
ادا نجحت الدالة فسترجع عدد البيتات التي أستقبلت وادا فشلت ترجع قيمة SOCKET_ERROR وادا رجعت 0 فهدا يعني أن السوكت قد غلق.
ملاحضة:
هده الدالة تقوم باستقبال عدد البيتات التي وضعت .والمشكل الان هو كيف أعرف حجم البينات التي أرسلت الي؟ الجواب هو استخدام الدالة ioctlsocket التي لها الشكل التالي:
ioctlsocket PROTO socket:DWORD, cmd:DWROD, lpArgument:DWORD
البرامترات:
- socket:مقبس السوكت.
- cmd:هو الطلب الدي تريد من الدالة تلبيته وهناك تلات أنواع من command وهي FIONBIO, FIONREADو SIOCATMARK وبما أننا نريد حجم البينات التي سوف ترسل الينا وسوف نركز علي FIONREAD. FIONREAD هدين الطلبين يعطون حجم البينات التي سوف تقرأ وحجم البينات سوف توضع في موقع يؤشر اليه lpArgument
- lpArgument:مؤشر اضافي مساعد للبرامتر السابق.
القيمة المرجعة:
ادا نجحت القيمة المرجعة تكون في eax هي NULL والعكس وادا فشلت ترجع قيمة من نوع SOCKET_ERROR .
ملاحضة هده الدالة كما أشرنا في الموضوع الأول تقوم بالتحكم في نمط السوكت ادا استعملنا الطلب FIONBIO فسوف تحول بين النمطين blocking أو non-blocking mode مع الطلب FIONREAD فسوف يكون عمل الدالة هو تحديد حجم البينات التي ستقرأ.
كود توضيحي:

السطر:
- بداية مقطع البينات.
- الاعلان عن متغير وهو SOCKET.
- الأعلان عن متغير لكي يحمل مفبض المساحة التي سنحجزها في الدكرة.
- متغير سيحمل عناون أو حجرة في المساحة التي سنحجزها.
- متغير سوف يكون بمتابة البرامتر الأخير للدالة ioctlsocket.
- متغير سوف يحمل عدد البينات التي قرأت.
- ---
- بداية مقطع الكود.
- -----
- استدعاء الدالة ioctlsocket.
- التحقق من نجاح عمل الدالة.
- حجز مكان في الدكرة بحجم البينات التي ستقرأ.
- نقل القيمة المرجعة من الدالة السابقة الي hMemory وهي عبارة عن مقبض للمساحة التي تم حجزها.
- استعمال الدالة GlobalLock التي لها بارامتر وحيد وهو مقبض المساحة التي تم حجزها وهده الدالة تعيد عناون أو حجرة في المساحة التي تم حجزها ويمكننا استخدام هدا العنوان لنخزن فيه ما تم قرأته.
- نقل القيمة المرجعة من الدالة السابقة الي buffer الدي سيحمل ما تم قرأته.
- استدعاء الدالة recv.
- نقل عدد البيتات التي قرأت الي actual_data_read.
- ----.
- ----.
- ----.
- تحرير الداكرة.
- تحرير الداكرة.
- نهاية شرط التحقق السابق .
والسلام.