اکسپرت متاتریدر ۴ با دنیای بیرون تبادل اطلاعات می‌کند…

اکسپرت متاتریدر 4

مقدمه

در اینجا نرم‌افزاری داریم که برای اکسپرت متاتریدر ۴ قابلیت ساخت هم سرور و هم کلاینت را فرآهم می‌کند. کلاینت‌ها (Clients) نیز می‌توانند هم با سرورهای خودشان و هم با هر نوع سرور دیگری که اتصال نظیر به نظیر (Peer-to-Peer) فرآهم می‌کند، ارتباط برقرار کنند. این ابزاری که برای نرم‌افزار ارائه شده‌است، دو جزء دارد:

  • exe – فرآیندی ویندوزی است که در بکگراند عمل کرده (بدون کنسول/میز فرمان) و در صورت نیازِ جزء دوم یعنی NetEventsProcDLL.dll اجرا (یا متوقف) می‌شود. با درخواست اپلیکیشن‌ها، می‌تواند برای آنها هم سرور و هم کلاینت ایجاد کند: هم برای سرورهای خودشان و هم برای هر نوع سرور دیگری که اتصال peer-to-peer فرآهم می‌آورد. برای مثال، می‌توانید کلاینت‌هایی ایجاد کنید که با وب‌سایت‌ها تبادل اطلاعات کنند. البته، اگر بتوانید پروتکل HTTP را ساپورت کنید.
  • dll – یک رابط بین اپلیکیشنی است که نیازمند سرویس‌های پردازشی NetEventsProc.exe و پردازش خود NetEventsProc.exe است. به‌لطف رابط DLL هر برنامه‌ای که به هر زبانی نوشته شده باشد را می‌توان برای این ابزار به‌منظور تبادل دوطرفه‌ی اطلاعات استفاده کرد. اکسپرت متاتریدر ۴ فقط مثالی است از کارایی این ابزار.

ساختار این مقاله بدین شکل است:

  • استارت سریع (Quick Start): در ابتدا، کاربرد عملی این ابزار در مثالی ساده نشان داده شده‌است، و سپس مثال‌های پیچیده‌تر خواهیم داشت.
  • مشخصات رابط DLL: توضیحات ریز و دقیق از توابع[۱]DLL و سرویس‌های ارائه‌شده از پردازش exe در زمان ارجاع به این توابع از اپلیکیشن‌ها.
  • اجرای پروژه: در اولین زمان ممکن جزئیات اجرای این پروژه به‌شکل شفاف بیان می‌شود.

فایل پیوست NetServerClient.zip شامل ۲ پروژه‌ی مایکروسافت ویژوال استودیو ۲۰۱۰ است: NetEventsProc – برای ساختن NetEventsProc.exe، و NetEventsProcDLL برای ساختن NetEventsProcDLL.dll. سورس کدها همراه با جزئیات آورده شده‌اند. می‌توانید جزئیات اجرای پروژه را ببینید و آن را مطابق با نیاز خاص خود، در صورت تمایل، تغییر دهید.

NetEventsProc.exe، سرور و کلاینت را با استفاده از سوکت‌های ناهمزمان (asynchronous sockets) پیاده‌سازی می‌کند. برای تغییر حالت سوکت‌ها به ناهمزمان (asynchronousاز یکی از روش‌های ممکن برای کار در این حالت استفاده شده‌است: [یعنی] اتصال سوکت‌ها به WSAEventSelect(h_Socket, h_Event, FD_ALL_EVENTS) network events.

این پروژه بر اساس کار حرفه‌ای استاد بزرگ اِلمو (Elmue) انجام شده‌است.

  1. استارت سریع:
    • فایل zip

این فایل را اِکسترکت کنید و موارد زیر را در آن پیدا خواهید کرد:

  • dll – این فایل را در پوشه‌ی “C:\Windows\System32” قرار دهید.
  • exe – پوشه‌ “C:\NetEventsProc” را بسازید و NetEventsProc.exe را در این پوشه قرار دهید. NetEventsProcDLL.dll دقیقاً این پوشه را برای ماژول NetEventsProc.exe جستجو خواهد کرد.

اجزاء (یا همان کامپوننت‌های) زیر نیز مکانیزمی برای ورود توابع DLL از NetEventsProcDLL.dll به اپلیکیشن‌ها را فرآهم می‌کنند:

  • mqh – نمونه‌ی اولیه‌ی توابعی است که از NetEventsProcDLL.dll به اکسپرت متاتریدر ۴ وارد شده‌است. این فایل را در پوشه‌ی نرم‌افزار قرار دهید (“MetaTrader 4\experts\include”).
  • h – تعریف کلاس C++ که شامل تمام نمونه‌های اولیه‌ی توابع DLL از NetEventsProcDLL.dll می‌شود. آوردن این کلاس در برنامه‌ی C++ اجازه‌ی وارد کردن تمام توابع DLL از NetEventsProcDLL.dll را به ما می‌دهد. برای برنامه‌هایی که با زبان‌های دیگری نوشته شده‌اند، یا باید هر تابع را جدا وارد کنید، یا اینکه تعریف این کلاس را به‌ترتیب دوباره بنویسید.
  • lib – ماژولی است که جزئی از برنامه‌هایی است که توابع DLL را از NetEventsProcDLL.dll در زمان بارگذاری حالت اتصال پویا (=dynamic linking mode) (کامپایل می‌شود با /EHsc/link NetEventsProcDLL.lib)، وارد می‌کنند.

این کار در واقع فرآیند پیکربندی را کامل می‌کند. اکنون می‌توانید اکسپرت متاتریدر ۴ و اپلیکیشن‌ها را با هر زبان برنامه‌نویسی، نوشته، و از توابع DLL برای ایجاد سرور و کلاینت استفاده کنید.

برای اینکه مسیر بیراهه نرویم، سورس کدهای ImportNetEventsProcDLL.mqh و cNetEventsProcDLL.h را اینجا آورده‌ایم. فایل هِدِر ImportNetEventsProcDLL.mqh شامل نمونه‌های اولیه‌ی توابع واردشده‌ی DLL [۲] برنامه‌ی NetEventsProcDLL.dll، و دو تابع سرویس اضافی، می‌شود:

تابع GetErrMsg، کدهای بازگشتی توابع DLL را به متن تبدیل می‌کند. تابع FormatIP، نمایش باینری آدرس‌های آی‌پی را به فرمت استاندارد متنی مانند “۹۳.۱۲۷.۱۱۰.۱۶۱”، تبدیل می‌کند. شما می‌بایستی فایل ImportNetEventsProcDLL.mqh را به پوشه‌ی نرم‌افزار (MetaTrader 4\experts\include”) انتقال دهید.

در اینجا نیز سورس کد ImportNetEventsProcDLL.mqh را مشاهده می‌کنید (فقط بخشی از این فایل آورده شده که مستقیماً با تعریف نمونه‌های اولیه‌ی توابع وارد‌شده‌ی DLL، ارتباط دارد):

فایل cNetEventsProcDLL.h تعریف کلاس C++ را همراه با تمامی توابع DLL واردشده از NetEventsProcDLL.dll را در خود دارد. در اینجا سورس کد این فایل را مشاهده می‌کنید:

  • فایل zip

این فایل شامل سورس کدها برای تمامی برنامه‌هایی است که در مثال‌های دِمو از آنها استفاده شده‌است. برنامه‌های C++ در قالب پروژه‌های Client  و EchoServer مایکروسافت ویژوال استودیو ۲۰۱۰، ارائه شده‌اند. سورس کدهای برنامه‌های MQL4 نیز در این فایل، همراه با فایل ImportNetEventsProcDLL.mqh آمده‌ است. فایل ImportNetEventsProcDLL.mqh برای وارد کردن توابع DLL به برنامه‌های MQL4 استفاده می‌شود. این فایل را در پوشه‌ی “MetaTrader 4\experts\include” کپی کنید.

در بحث و بررسی بیشتر، سورس کدهای تمام این برنامه‌ها لیست شده‌اند. ۳ مثال را درنظر می‌گیریم که کار کردن با تمام توابع DLL را در زبان‌های برنامه‌نویسی MQL4 و C++، نشان می‌دهد:

  • بخش ۱.۲.۱. تبادل اطلاعات بین سرور-اکسپرت متاتریدر ۴ و کلاینت-C++ را نشان می‌دهد.
  • بخش ۱.۲.۲. تبادل اطلاعات بین سرور-C++ و کلاینت-اکسپرت متاتریدر ۴ را نشان می‌دهد.
  • بخش ۱.۲.۳. تبادل اطلاعات بین اکسپرت‌های متاتریدر ۴ را نشان می‌‌دهد. یکی از این اکسپرت‌ها به‌عنوان سرور عمل کرده و برای دیگر اکسپرت‌ها یا اندیکاتورهای متاتریدر ۴ (کلاینت‌های اکسپرت‌ها)، مقادیر[۳] اندیکاتور را فرآهم می‌کند. به‌عبارت دیگر، ما توزیع مقادیر یک اندیکاتور “ایمن” را بین کلاینت‌ها، اجرا می‌کنیم.
  • سرور-اکسپرت متاتریدر ۴ و کلاینت-برنامه‌ی C++

این کارِ سنتیِ تبادل اطلاعات بین اکسپرت متاتریدر ۴ و برنامه‌ی C++ را درنظر بگیرید:

  • mq4 – اکسپرت به‌عنوان یک اِکو سرور (Echo Server) عمل می‌کند.
  • cpp – برنامه‌ی C++ به‌عنوان یک کلاینت برای سرور اکسپرت عمل می‌کند.

کلاینت C++ پیام‌هایی که کاربر در میز فرمان (=Console) وارد می‌کند را می‌خواند و آنها را به اکسپرت می‌فرستد. اکسپرت پیام‌ها را دریافت کرده و آنها را در پنجره‌ی نرم‌‌افزار نشان داده و آنها را به دریافت‌کننده ارسال می‌کند. تصویر زیر این ایده را نشان می‌دهد:

اکسپرت متاتریدر

در اینجا سورس کد اکسپرت EchoServer.mq4 را داریم که مانند اِکو سرور عمل می‌کند:

جهت اجرای این مثال دِمو شما بایستی:

  1. فایل mq4 را در پوشه‌ی نرم‌افزار (“МetaТrader 4\experts”) قرار داده و آن را کامپایل (Compile) کنید.
  2. پروژه‌ی Client را در ویژوال استودیو باز کرده و آن را با استفاده از پیکربندی[۴] Release، درست کنید. اگر می‌خواهید این پروژه را در یک IDE [۵] دیگر بسازید، فراموش نکنید که ماژول lib را به‌عنوان یک ورودی اضافی برای اِدیتور تعیین کنید (کامپایل با: EHsc/link NetEventsProcDLL.lib/).
  3. ماژول اجرایی exe را اجرا کنید. خطایی با کد ۱۰۰۵۷ و لیستی از آی‌پی‌های محلی[۶] کامپیوترتان دریافت می‌کنید. خط زیر را در سورس کد Client.cpp اصلاح کنید:

با جایگزین کردن “۱۹۲.۱۶۸.۱.۵” با اولین (یا تنها) آی‌پی محلی و کامپایل کردن دوباره‌ی پروژه.

  1. اکسپرت EchoServer را در هر نموداری که می‌خواهید، در متاتریدر ۴ اجرا کنید. اگر همه‌چیز درست انجام شده باشد، نرم‌افزار چنین پیغامی را می‌دهد:

“ServerOpen() return is: OK”, “Server is Opened and Waiting for Client connection requests…” .

سپس روی هر تیک، اکسپرت درخواست‌های کانکشن را بررسی کرده، متصل شده، پیام‌های دریافتی از هر کانکشن را خوانده، و یک رونوشت از پیام را برای دریافت‌کننده می‌فرستد. اکسپرت تمام این اطلاعات را در پنجره‌ی نرم‌افزار نشان می‌دهد.

  1. اکنون می‌توانید برنامه‌ی exe که در مرحله‌ی ۳ ساخته‌اید را اجرا کنید.
  2. می‌توانید چند نسخه از این نرم‌افزار را اجرا کرده و ببینید که اکسپرت چگونه با تمامی آنها تبادل اطلاعات انجام می‌دهد.
  3. اگر به‌جای آی‌پی محلی در گام ۳، آی‌پی جهانی کامپیوتر را در جایی‌ که سرور اکسپرت در حال فعالیت است، تنظیم کنید، آن‌وقت در این‌ صورت می‌توانید exe را در هر کامپیوتری در هر جای دنیا که به اینترنت وصل است، اجرا کرده و با اکسپرت ارتباط برقرار کنید. البته فراموش نکنید که باید تمامی فایروال‌های موجود را غیرفعال کنید.
  • سرور-برنامه‌ی C++ و کلاینت-اکسپرت متاتریدر ۴

این کارِ سنتیِ تبادل اطلاعات بین اکسپرت متاتریدر ۴ و برنامه‌ی C++ را درنظر بگیرید:

  • cpp – برنامه‌ی C++ به‌عنوان یک اِکو سرور (Echo Server) عمل می‌کند.
  • mq4 – اکسپرت به‌عنوان یک کلاینت برای سرور C++ عمل می‌کند.

اکسپرت-به‌عنوان کلاینت-قیمت‌ها را از اَرزی که روی آن run (ران=اجرا) شده‌است، خوانده و این قیمت‌ها را به سرور C++ می‌فرستد. سرور C++ نیز قیمت‌ها را به دریافت‌کننده فرستاده که پس از دریافت در پنجره‌ی نرم‌افزار نمایش داده می‌شوند. تصویر زیر این ایده را نشان می‌دهد:

اکسپرت متاتریدر

در اینجا سورس کد اکسپرت Client.mq4 را داریم که به‌عنوان کلاینت عمل می‌کند:

و در اینجا نیز سورس کد برنامه‌ی C++ [یعنی] EchoServer.cpp را داریم که به‌عنوان یک اِکو سرور برای کلاینت-اکسپرت عمل می‌کند.

برای اجرای این مثال دِمو شما بایستی:

  1. فایل mq4 را در پوشه‌ی نرم‌افزار (“MetaTrader 4\experts”) قرار داده، و آی‌پی محلی را به این خط ارجاع دهید (همان که از مثال قبلی ۱.۲.۱ بدست آمد)

و آن لرا کامپایل کنید. اگر سرور ‌C++ در کامپیوتر دیگری قرار دارد، آنگاه باید آی‌پی جهانی این کامپیوتر را در اینجا وارد کنید. فراموش نکنید که تمامی سرویس‌های حفاظتی در فایروال خود را باید غیرفعال کنید.

  1. پروژه‌ی Client را در ویژوال استودیو باز کرده و آن را با استفاده از پیکربندی Release، درست کنید. اگر می‌خواهید این پروژه را در یک IDE دیگر بسازید، فراموش نکنید که ماژول lib را به‌عنوان یک ورودی اضافی برای اِدیتور تعیین کنید (کامپایل با: EHsc/link NetEventsProcDLL.lib/).
  2. سرور C++ exe را اجرا کنید. اگر همه‌چیز درست انجام شده باشد، چنین پیغامی را خواهید دید:

“ServerOpen() fine, we now are waiting for connections…..”.

فشردن هر کلیدی، سرور را بسته و برنامه را خاتمه می‌دهد.

  1. mq4 را روی هر نموداری از متاتریدر که می‌خواهید، اجرا کنید.
  2. می‌توانید همزمان این کلاینت را روی چند نمودار داشته باشید؛ در یک یا چند نرم‌افزار مختلف؛ در یک یا چند کامپیوتر مختلف.
  3. ببینید که چگونه سرور ‌‌C++ و کلاینت‌های متاتریدر ۴، کار می‌کنند. فشردن هر کلید باعث بسته شدن برنامه و سرور خواهد شد.
  • اندیکاتور-اکسپرت متاتریدر ۴ (سرور-اکسپرت) و اندیکاتور-کلاینت متاتریدر ۴

اندیکاتور-اکسپرت (سرور-اکسپرت) برای اندیکاتورها-کلاینت‌ها مقادیر اندیکاتور را فرآهم می‌کند. در این خصوص، این مقادیر، مقادیرِ اندیکاتورِ (…)iEnvelops استاندارد هستند. این مثال دارای یک اَرزش بالقوه برای توزیع مقادیر اندیکاتوری “ایمن” به تمام عضوها-کلاینت‌ها است.

تصویر زیر این ایده را نشان می‌دهد:

اکسپرت متاتریدر

در اینجا سورس کد اکسپرت ServerSendInd.mq4 را داریم که به‌عنوان تامین‌کننده‌ی مقادیر اندیکاتور (…)iEnvelops عمل می‌کند:

و در اینجا نیز سورس کد اندیکاتور-کلاینت ClientIndicator.mq4 را داریم که مقادیر اندیکاتور (…)iEnvelops را از اکسپرت ServerSendInd.mq4 می‌گیرد:

برای اجرای این مثال دِمو شما بایستی:

  1. فایل mq4 را در پوشه‌ی نرم‌افزار (“МetaТrader 4\experts\”) قرار دهید و آن را کامپایل کنید.
  2. فایل mq4 را در پوشه‌ی نرم‌افزار (“МetaТrader 4\experts\indicators\”) قرار داده و آی‌پی محلی را به این خط ارجاع دهید (همان که از مثال قبلی ۱.۲.۱ بدست آمد)

اگر ServerSendInd در کامپیوتر دیگری قرار دارد، آنگاه باید آی‌پی جهانی این کامپیوتر را در اینجا وارد کنید. فراموش نکنید که تمامی سرویس‌های حفاظتی در فایروال خود را باید غیرفعال کنید. آن را نیز کامپایل کنید.

  1. ServerSendInd را اجرا کنید. اگر همه‌چیز درست انجام شده باشد، چنین پیغامی را مشاهده خواهید کرد:

“ServerOpen() fine, we now are waiting for connections…..”.

  1. اندیکاتور mq4 را روی هر نموداری که خواستید‌، اجرا کنید. ۲ خط اندیکاتور روی نمودار نمایش داده خواهند شد. اگر اندیکاتور Envelops استاندارد را روی همان نمودار اجرا می‌کنید، اطمینان حاصل کنید که هر دو خط اندیکاتور ما‌ با خطوط اندیکاتور استاندارد منطبق باشند.
  2. می‌توانید اندیکاتور ClientIndicatorرا روی چند نمودار به‌صورت همزمان اجرا کنید؛ در یک یا چند نرم‌افزار؛ در یک یا چند کامپیوتر.
  3. ببینید که چگونه سرور ServerSendInd و اندیکاتور ClientIndicator، کار می‌کنند. تایم‌فریم نموداری که اندیکاتورِ ClientIndicator دارد را تغییر دهید. سرور ServerSendInd سریعاً خودش را برای فرستادن مقادیر اندیکاتور برای آن تایم‌فریم، تنظیم می‌کند.
  1. خصوصیات رابط DLL

در این بخش، با جزئیات، تمام توابع DLL و پارامترهایی که فراخواندن آنها نیاز است را توضیح می‌دهیم. تمامی توابع در صورت اجرای درست، صفر می‌شوند. در غیر این‌ صورت توابع به کدهای خطای winsock2 API برمی‌گردند. تمام توابع DLL فرستاده شده در اِعلامیه‌ی کلاس C++ cNetEventsProcDLL.h آورده شده‌اند، بنابراین، سورس کد این فایل را در اینجا می‌آوریم:

حال بیایید تمامی توابع ‌DLL را به‌ترتیب ظهورشان در این مطلب، درنظر بگیریم:

  1. ConnectTo – از سرور درخواست ایجاد کانکشن می‌کند:

پارامترهای تابع:

  • char* ps8_ServerIP – آدرس آی‌پی سروری که شما می‌خواهید به آن متصل شوید (برای مثال “۱۲۷.۱۱۰.۱۶۲”). اگر سرور محلی باشد، آنگاه آی‌پی را تعیین کنید، نه “۱۲۷.۰.۰.۱”، بلکه آی‌پی بدست‌آمده‌، مانند همانی که در مثال ۱.۲.۱ بود.
  • int s32_Port – شماره‌ی پورتی که سرور به آن “گوش فرا می‌دهد”.
  • int* ph_Client – اگر تابع با موفقیت بسته شود، هَندل کانکشن در این متغییر قرار می‌گیرد. این هندل باید در تمام عملیات‌های بعدی کانکشن استفاده شود.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت. مثال C++:

  1. ConnectClose – از سرور درخواست بسته شدن کانکشن می‌کند.

پارامترهای تابع:

  • int h_Client – هندل کانکشنی که باید بسته شود. اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. ServerOpen – درخواست برای ایجاد سرور.

پارامترهای تابع:

  • int s32_Port – شماره پورتی که سرور به آن “گوش فرا داده” و منتظر درخواست کلاینت‌ها می‌ماند. اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. GetAllConnections – درخواست به سرور برای دریافت اطلاعات در مورد تمام کانکشن‌های موجود:

پارامترهای تابع:

  • int ph_Client[62]  – آرایۀ (Array) خروجی ‌‌که در آن سرور تمام هندل‌های کانکشن‌های موجود را قرار می‌دهد.
  • int ps32_ClientIP[62] آرایۀ خروجی که در آن سرور آدرس‌های آی‌پی تمام کانکشن‌های موجود را قرار می‌دهد. برای تبدیل این آدرس‌ها به فرمت استاندارد مانند “۱۲۷.۱۱۰.۱۶۱”، از تابع string FormatIP(int IP) برای اکسپرت متاتریدر ۴ استفاده کنید؛ یا هر نوع تابع مشابهی که در مثال‌های برنامه‌های C++ آورده شده‌است. عدد ۶۲ در اندازه‌ی این آرایه به‌طور اتفاقی آورده نشده: این عدد محدودیت تعداد کانکشن‌های (کلاینت‌های) ممکن را در یک سرور تعیین می‌کند.
  • int* ps32_ClientCount سرور، تعداد کانکشن‌های موجود را در این متغییر قرار می‌دهد، برای مثال، تعداد عناصر مورد اشاره در آرایه‌های بالا.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. DisconnectClient درخواست به سرور برای بستن کانکشن با یکی از کلاینت‌های آن.

پارامترهای تابع:

  • int h_Client هندل کانکشنی که باید بسته شود. اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. ServerClose – درخواست برای بستن سرور.

وقتی سرور بسته می‌شود، تمام کانکشن‌های موجود نیز بسته می‌شوند، بنابراین، هر کلاینت کد بازگشتی “No Connection” را در جواب هر عملیاتی دریافت خواهد کرد. اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت. مثال C++:

گروه بعدی توابع مستقیماً با تبادل داده از طریق کانکشن موجود، در ارتباط هستند. دریافت اطلاعات برای هر یک از کانکشن‌های موجود به‌حالت ناهمزمان انجام می‌شود. برای مثال، بدون پاسخ از دریافت‌کننده.

تمامی داده‌ها به‌شکل واحدهای مستقل تبادلی، دریافت و ارسال می‌شوند، برای مثال، بلوک. تمامی بلوک‌ها برای هر دریافت‌کننده در FIFO Stack جمع‌آوری می‌شوند. دریافت‌کننده می‌تواند این بلوک‌ها را هر زمان که می‌خواهد از stack ([معادل آن در فارسی می‌شود: انبار]) بازیابی کند. هر تابع تبادلی، با یک بلوک کار می‌کند.

در عملیات‌های ارسال داده، ممکن است عملیات موفقیت‌آمیز باشد اما کد بازگشتی متفاوت با صفر بوده و ممکن است مقادیر زیر را داشته باشد:

  • WSAEWOULDBLOCK – عملیات موفقیت‌آمیز بوده، داده‌ها هنوز به گیرنده ارسال نشده‌اند، اما در زمان مناسب این کار انجام خواهد شد. کاربر نیاز نیست هیچ‌کاری بکند.
  • WSA_IO_PENDING – تحویل داده‌های قبلی هنوز کامل نشده‌است، کاربر باید ارسال داده‌ را به بعد موکول کند. این یک وضعیت عادی است، بنابراین، درست عمل کردن تابع مفروض است.

هرگونه کد بازگشتی دیگر، نشانگر خطای کاربر است.

  1. SendToInt – درخواست برای ارسال بلوک داده (int type array/آرایه از نوع عددصحیح) از طریق کانکشن موجود.

پارامترهای تابع:

  • SOCKET h_Client – هندل کانکشن موجود.
  • int ps32_SendBuf[s32_SendBufLen] – تک بلوکی (int type array) که شما باید برای کلاینت بفرستید.
  • int s32_SendBufLen – اندازه‌ی آرایه.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. SendToDouble – درخواست برای ارسال بلوک داده (double type array) از طریق کانکشن موجود.

پارامترهای تابع:

  • SOCKET h_Client – هندل کانکشن موجود.
  • double pd_SendBuf[s32_SendBufLen] – تک بلوکی (double type array) که شما باید برای کلاینت بفرستید.
  • int s32_SendBufLen – اندازه‌ی آرایه.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. SendToString – درخواست برای ارسال بلوک داده (char type array) از طریق کانکشن موجود.

پارامترهای تابع:

  • SOCKET h_Client – هندل کانکشن موجود.
  • char ps8_SendBuf[s32_SendBufLen] – تک بلوکی (char type array) که شما باید برای کلاینت بفرستید.
  • int s32_SendBufLen – اندازه‌ی آرایه.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  • ReadFromInt – درخواست برای دریافت بلوک‌های داده (int type array) از طریق کانکشن موجود.

پارامترهای تابع:

  • SOCKET h_Client – هندل کانکشن موجود.
  • int ps32_ReadBuf[s32_ReadBufLen] – آرایه از نوع عددصحیح برای دریافت بلوک داده.
  • int s32_ReadBufLen – اندازه‌ی آرایۀ دریافتی.
  • int* ps32ReadLen – این متغییر اندازه‌ی واقعی بلوک‌ داده را در خود نگه می‌دارد، که قبلاً دریافت شده‌ و در آرایۀ ps32_ReadBuf[] قرار دارد. اگر اندازه‌ی آرایه‌ی دریافتی برای دریافت بلوک داده کافی نباشد، آنگاه این متغییر اندازه را در خود با یک علامت منفی، نگه می‌دارد. بلوک در stack باقی‌ مانده و کد بازگشتی برابر با صفر خواهد بود. اگر در stack کلاینت هیچ‌ داده‌ای با هندل تعیین‌شده وجود نداشته باشد، این متغییر برابر با صفر می‌ماند و کد بازگشتی هم برابر با صفر خواهد بود.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  • ReadFromDouble – درخواست برای دریافت بلوک‌های داده (double type array) از طریق کانکشن موجود.

پارامترهای تابع:

  • SOCKET h_Client – هندل کانکشن موجود.
  • double pd_ReadBuf[s32_ReadBufLen] – double type array برای دریافت بلوک داده.
  • int s32_ReadBufLen – اندازه‌ی آرایۀ دریافتی.
  • int* ps32ReadLen – این متغییر اندازه‌ی واقعی بلوک‌ داده را در خود نگه می‌دارد، که قبلاً دریافت شده‌ و در آرایۀ ps32_ReadBuf[] قرار دارد. اگر اندازه‌ی آرایه‌ی دریافتی برای دریافت بلوک داده کافی نباشد، آنگاه این متغییر اندازه را در خود با یک علامت منفی، نگه می‌دارد. بلوک در stack باقی‌ مانده و کد بازگشتی برابر با صفر خواهد بود. اگر در stack کلاینت هیچ‌ داده‌ای با هندل تعیین‌شده وجود نداشته باشد، این متغییر برابر با صفر می‌ماند و کد بازگشتی هم برابر با صفر خواهد بود.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  • ReadFromString – درخواست برای دریافت بلوک داده (char type array) از طریق کانکشن موجود.

پارامترهای تابع:

  • SOCKET h_Client – هندل کانکشن موجود.
  • char ps8_ReadBuf[s32_ReadBufLen] – char type array برای دریافت بلوک داده.
  • int s32_‌ReadBufLen – اندازه‌ی آرایۀ دریافتی.
  • int* ps32ReadLen – این متغییر اندازه‌ی واقعی بلوک‌ داده را در خود نگه می‌دارد، که قبلاً دریافت شده و در آرایۀ ps32_ReadBuf[] قرار دارد. اگر اندازه‌ی آرایه‌ی دریافتی برای دریافت بلوک داده کافی نباشد، آنگاه این متغییر اندازه را در خود با یک علامت منفی، نگه می‌دارد. بلوک در stack باقی‌ مانده و کد بازگشتی برابر با صفر خواهد بود. اگر در stack کلاینت هیچ‌ داده‌ای با هندل تعیین‌شده وجود نداشته باشد، این متغییر برابر با صفر می‌ماند و کد بازگشتی هم برابر با صفر خواهد بود.

اگر موفقیت‌آمیز باشد، تابع به صحیح برمی‌گردد، در غیر این‌ صورت، به کدهای خطای winsock2 API برخواهد گشت.

مثال C++:

  1. اجرای پروژه

فایل ضمیمه‌ی NetServerClient.zip حاوی ۲ پروژه‌ی مایکروسافت ویژوال استودیو ۲۰۱۰ است:

  • NetEventsProc – برای ساختن exe.
  • NetEventsProcDLL – برای ساختن dll.

سورس کدها همراه با جزئیات آورده شده‌اند. می‌توانید جزئیات اجرای پروژه را ببینید و آن را مطابق با نیاز خاص خود، در صورت تمایل، تغییر دهید.

NetEventsProc.exe، سرور و کلاینت را با استفاده از سوکت‌های ناهمزمان (asynchronous sockets) پیاده‌سازی می‌کند. برای تغییر حالت سوکت‌ها به ناهمزمان (asynchronousاز یکی از روش‌های ممکن برای کار در این حالت استفاده شده‌است: [یعنی] اتصال سوکت‌ها به WSAEventSelect(h_Socket, h_Event, FD_ALL_EVENTS) network events.

در صورتیکه این مقاله رضایت خوانندگان را جلب کند، در نسخه‌های بعدی کاملاً به بحث جزئیات در اجرای پروژه پرداخته خواهد شد. یکبار دیگر جا دارد بگوییم که این پروژه تماماً بر اساس کار حرفه‌ای استاد بزرگ اِلمو نوشته شده‌است.

  1. نتیجه‌گیری

امیدوار هستم که این مقاله مشکلات شما را برای تبادل اطلاعات بین اکسپرت متاتریدر ۴ با هر اپلیکیشن ثانویه‌ای، حل کند و بحث مکان و فاصله مطرح نباشد؛ همچنین بتوانید این کار را با کامپیوترهای محلی یا هر سیستمی از طریق remote connection یا موارد مشابه، انجام دهید. امیدوارم کدهای استفاده‌شده در این مقاله برای شما سخت نبوده باشند و همچنین از توابع DLL بتوانید به‌راحتی استفاده کنید چراکه تمام تلاش من بر ساده‌نویسی بوده است.‌

یک نکته‌ی مهم دیگر که باید به آن اشاره کرد:

تقریباً تمام رایانه‌ها مانند گره‌های (Nods) یک شبکه محلی (LAN) هستند. حتی اگر شما تنها یک کامپیوتر دارید، احتمالاً گره LAN یک-کامپیوتری تشکیل شده‌است.

اتصال به شبکه‌های گسترده (WAN) از طریق سخت‌افزارهای اضافی انجام می‌شود که می‌توان آنها را روتر، مودم، یا با برخی اصطلاحات فنی دیگر، نام‌گذاری کرد. برای سادگی ما آنها را روتر می‌نامیم. از این‌ رو، ارائه‌دهندگان روتر، یک آی‌پی جهانی [به آن] اختصاص می‌دهند.

روترها هنگام کار با WAN مشکلات خاص امنیتی را حل می‌کنند، و این اجازه را می‌دهند که از آی‌پی‌های جهانی چشم‌پوشی شده تا کانکشن WAN به شبکه محلی ‌راحت وصل شود. اما در حقیقت آنها مفهوم اولیه‌ی WAN را تحریف کرده که این کار احتمال اتصال مستقیم peer-to-peer را برای هر دو کامپیوتری [در هر جا] فرآهم می‌سازد.

چنین اثری ناشی از این واقعیت است که عملاً هر روتری اصطلاحاً ترجمه‌ی آدرس شبکه (NAT) را انجام می‌دهد. آدرس شبکه به‌شکل چندتایی <پروتکل، آی‌پی، پورت> نشان داده می‌شود. هر مورد را روتر می‌تواند تغییر دهد، همه‌ی اینها به مدل خاص روتر بستگی دارد.

در این مورد، رایانه‌ای که به WAN از طریق LAN دسترسی پیدا می‌کند، تمام مزایای ارائه‌شده توسط WAN را ندارد. اکثریت روترها ویژگی OUTBOUND را دارند که اجازه می‌دهد روتر آدرس شبکه‌ی کلاینت LAN را ذخیره کند، که با آن شبکه‌ی جهانی WAN را از طریق شبکه LAN با چند درخواست خطاب قرار داده است.

با تشکر از این ویژگی، روتر می‌تواند تمام اطلاعات دریافت‌شده توسط روتر را به‌مانند پاسخی به درخواست کلاینت، برای او ارسال کند. بنابراین کلاینت LAN می‌تواند به سرورهای WAN متصل شود. با این ‌حال، این موضوع ممکن است همیشه درست نباشد، زیرا به‌دلایل امنیتی و نظم کاری، برخی از آدرس‌های شبکه ممکن است سخت‌افزاری مسدود شوند.

بنابراین، برای سازماندهی سرور بر روی یک کامپیوتر LAN، شما باید به‌اصطلاح پورت فورواردینگ را تنظیم کنید. همانطورکه برای مثال در این مقاله دیدید، در ساده‌ترین مورد یعنی یک کامپیوتر LAN، شما باید شماره پورت ۲۰۰۰ را فوروارد کنید. شما می‌توانید با اتصال به سایت مینی روتر در مرورگر خود، خودتان این کار را انجام دهید یا می‌توانید از یک نفر حرفه‌ای تقاضا کنید. احتمالاً این مینی سایت در ۱۹۲.۱۶۸.۱.۱ موجود باشد.

اگر می‌خواهید از طریق WAN تبادل اطلاعات را انجام دهید، باید تمام این موارد را درنظر بگیرید.

 

این مقاله دارای فایل پیوست است.

فایل پیوست مقاله را از اینجا میتوانید دانلود کنید .

مقالات پیشنهادی :

امینی

→ خواندن مطلب قبلی

متاتریدر ( MetaTrader ) چیست؟

خواندن مطلب بعدی ←

الگویی برای تریلینگ اِستاپ و خروج از بازار

نوشتن نظر شما

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

1 × پنج =