PDA

View Full Version : سوال: برنامه نویسی UDP



bsflasher
یک شنبه 01 دی 1387, 18:01 عصر
با سلام
در حال نوشتن برنامه ای در محیط ++VC هستم که نیاز به انتقال داده از طریق پروتکل UDP دارد، برای ارسال مشکلی وجود ندارد اما هنگام دریافت Event خاصی درنظر گرفته نشده است به دنبال کلاسی هستم که بتوان با استفاده از آن داده را بدون وابستگی به دیالوگ یا فرم ارسال ویا دریافت کرد. اگر کمکی بکنید ممنون میشوم .

ذکر این نکته خالی از لطف نیست که در بعضی از مثالهای موجود در اینترنت از رویدادهای دیالوگ یا فرم استفاده شده است که مدنظر بنده نمیباشد. کامپوننت هایی مانند IP*Works نیز وجود دارند اما اطلاعات باینری را ارسال و دریافت نمیکنند.
باتشکر

Nima_NF
یک شنبه 01 دی 1387, 19:50 عصر
چرا مستقیم از API های socket استفاده نمی کنید؟

نوع پروتکل را UDP قرار دهید، لینک های زیر :
MDSDN دارای مثال های فراوانی (در بخش using sockets ) می باشد:



MSDN-> win32 and com ->Networking -> Network protocols -> Windows sockets

لینک آن در MSDN
(http://msdn.microsoft.com/en-us/library/ms740673%28VS.85%29.aspx)

bsflasher
یک شنبه 01 دی 1387, 21:50 عصر
با تشکر از جواب
سوال من بدلیل این بود که خود VS مستقیما دارای Event ای مانند OnReceive نیست و این Event باید دستی تولید گردد. مشکل همین جاست...

Nima_NF
یک شنبه 01 دی 1387, 23:41 عصر
کلاس های MFC از همان API ها درست شده اند، پس در این موارد که پیام ها ارسال می شوند حتما وجود دارد.

1) شما برای این کار می توانید از event ها برای Socket استفاده کنید، مانند WSAEventSelect که با مشخص کردن نوع فلگ مثلا FD_READ ، FD_WRITE، FD_CONNECT و ... همان کار می تواند انجام شود. یعنی در یک حلقه بی نهایت و داخل آن WSAWaitForMultipleEvents فراخوانی شود.
به این صورت تا زمانی که رویداد شما انجام نشود (پیام ارسال نشود) در همانجا باقی می ماند.
این شیوه برای برنامه های کنسول مناسب یا برنامه های ویندوزی با thread دیگر مناسب هست.
مثال در این مورد را می توانید از این مقاله و لینک دیگر مطالعه کنید:
http://www.codeproject.com/KB/IP/networkevents.aspx
http://msdn.microsoft.com/en-us/library/ms742219(VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms742219%28VS.85%29.aspx)


2) روش دیگر نیز همان استفاده از توابع مشابه CAsyncSocket است. در API ها با استفاده از WSAAsyncSelect و مانند آن می توانید پیام مورد نظر را (FD_READ و ...) تنظیم کنید و هرگاه آن عمل انجام شد پیامی به همراه سایر پیام های ویندوز ارسال می شود (نام پیام را خودتان می توانید تعیین کنید).
این روش برای برنامه های نوشته شده با win32 غیر کنسولی مناسب هست که بخشی برای پردازش پیام داشته باشد.



rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);
rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);


wMsg1 و 2 ارسال می شود. (همانند OnReceive در MFC )