ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی “ ورود به حساب” کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمیشود، اینجا را کلیک کنید.





صفحه 2 از 2 نخست 12
نمایش نتایج: از 11 به 16 از 16
  1. #11
    adminmsp
    مدیر کل و موسس سایت
    تاریخ عضویت
    1970 Jan
    محل سکونت
    M.S.P Soft
    نوشته ها
    1,588
    759
    419
    پس از تمام ارسال ها و دریافت ها، در نهایت برای قطع ارتباط یک سوکت میتوان از دستورات Close و Dispose و Shutdown استفاده کرد.
    در خصوص شی سوکت دستور Close و Dispose عملکرد یکسانی دارند و سوکت را کاملاً بسته و به نوعی نابود میکند و منابع سیستم عامل را آزاد میکنند.

    اما دستور Shutdown یک پارامتر از نوع System.Net.Sockets.SocketShutdown میگیرد و میتواند خط ارسال و دریافت را جداگانه ببندد.
    پیغامی که در عوض بسته شدن سوکت در یک سر به سوکت نظیر در آن سر میرسد، دریافت اطلاعات جدید با طول صفر بایت است.
    هنوز دستور دریافت اطلاعات را نگفته ایم ولی فعلاً بدانید که اگر اطلاعاتی با تعداد بایت صفر، دریافت شود، یعنی سوکت نظیر در آن سمت، دیگر وجود ندارد و قائدتاً باید در این سمت هم درصورت نیاز منابع سیستم را آزاد کنیم.

    در برخی برنامه ها که بسته شدن کامل و امن هر دو سوکت برایشان خیلی مهم است، اول Shutdown را با Send اجرا میکنند و بعد هم منتظر رسیدن پیغام نظیر از سوکت سمت دیگر میشوند و بعد سوکت را کامل میبندند.
    ولی اکثراً یک Close ساده، کافی است.

    سه دستور زیر تقریباً یک نتیجه دارند:

    کد PHP:
    'VB.Net
    <b>socket.Close()</b>
    DirectCast(socket, System.IDisposable).Dispose()
    socket.Shutdown(System.Net.Sockets.SocketShutdown.  Both)
     
     
    //C#‎.Net
    <b>socket.Close();</b>
    ((System.IDisposable)socket).Dispose();
    socket.Shutdown(System.Net.Sockets.SocketShutdown.  Both); 
    با M.S.P Soft به دنياي برنامه نويسي وارد شويد[برای نمایش لینک باید عضو شوید. ]
  2. #12
    adminmsp
    مدیر کل و موسس سایت
    تاریخ عضویت
    1970 Jan
    محل سکونت
    M.S.P Soft
    نوشته ها
    1,588
    759
    419
    سوکت کلاینت به محض اجرای دستور Connect آماده ارسال و دریافت اطلاعات است ولی در سرور عملاً باید دستورات Listen و Accept نیز اجرا شوند.

    متد Listen سرور را برای پذیرفتن درخواستهای کلاینتها به یک تعداد صف خاص آماده میکند، معمولاً آن را با حداکثر مقدار ممکن فراخانی میکنند تا در آینده و با کوچک و بزرگ شدن شبکه و توسعه و ... همواره کد صحیح کار کند ،ولی مقداردهی یک عدد منطقی و مورد انتظار شاید بد نباشد و مثلاً میتواند یک نیمچه سدی در مقابل حملات DOS باشد.

    سه دستور زیر دقیقاً یک کد IL تولید میکنند.
    [TABLE]
    [TR]
    [TD="class: gutter"][/TD]
    [/TR]
    [/TABLE]

    کد PHP:
     VB.Net'socket = New ...
    '
    socket.Bind (...
     
    socket.Listen(Integer.MaxValue)
    socket.Listen(&H7FFFFFFF)
    socket.Listen(2147483647)
     
     
    //C#‎.Net
    //socket = new ...
    //socket.Bind (...
      
    socket.Listen(int.MaxValue);
    socket.Listen0x7FFFFFFF);
    socket.Listen(2147483647); 
    با M.S.P Soft به دنياي برنامه نويسي وارد شويد[برای نمایش لینک باید عضو شوید. ]
  3. #13
    adminmsp
    مدیر کل و موسس سایت
    تاریخ عضویت
    1970 Jan
    محل سکونت
    M.S.P Soft
    نوشته ها
    1,588
    759
    419
    در کلاینت اوضاع خیلی ساده است یک شی سوکت میسازیم و با همان اقدام به دریافت و ارسال اطلاعات میکنیم، در واقعاً هر کلاینت فقط یک وظیفه دارد و آن اتصال به سرور است!

    ولی در سرور خیلی جزئی اوضاع فرق میکند و سرور باید یک خط ارتباطی با هر یک از کلاینت ها به طور مجزا داشته باشد، در نتیجه همان یک نمونه سوکتی که اول در سرور میسازیم کفایت نمیکند و ما نیاز به یک خط ویژه ارتباطی با هر کلاینت داریم.
    برای آنکه بهتر متوجه شوید، مرکز تلفن 118 را در نظر بگیرید، در ظاهر فقط یک تلفن 118 وجود دارد و این خیلی بدیهی است که از هر جایی کافی است فقط 118 را بگیریم، این لفظ کلی تلفن 118، مثل همان شی سوکت اصلی سرور میماند که در خودمان سرور با New آن را میسازیم.
    ولی بعد هر کس با 118 تماس میگیرد برای به یک اپراتور مجزا و یک گوش تلفن مجزا وصل میشود، شماره تماس همه گوش های تلفن مرکز، همان 118 است ولی مثل تماس گیرنده، اینجا یک گوشی وجود ندارد و کفایت نمیکند، اگر یک گوشی در 118 باشد، طبیعی است که همه صحبتهای تماس گیرنده و همه جوابهای مرکز قاطی میشوند.

    متد Accept مسئول برداشتن گوشی جدید در سرور و ایجاد یک خط ارتباطی مستقل است.

    با فراخوانی این متد ریسمان شما بلوکه و متوقف میشود تا اولین درخواست برقراری ارتباط از یک کلاینت برسد، به محض رسیدن درخواست، متد Accept ارتباط را میپذیرد و آن را برقرار میکند و یک نمونه جدید از شی سوکت به ما میدهد که این نمونه فقط مخصوص ارتباط ما با آن همان یک کلاینت است.
    یعنی تمام گرفتن و ارسال اطلاعات ما به یک کلاینت خاص باید توسط این نمونه سوکت جدید انجام میشود.


    دستور زیر آنقدر صبر میکند تا فقط یک کلاینت در خواست اتصال بدهد، انگاه اتصال را پذیرفته و یک پیغام متنی Hello برای کلاینت ارسال میکند و اتصال را پایان میدهد و میبندد و همه چیز تمام میشود !
    (دستور Send را توضیح خواهیم داد، فعلاً بدانید که وظیفه ارسال اطلاعات را به عهده دارد.)

    کد PHP:
    'VB.Net
    '
    socket = New ...
    'socket.Bind ( ...
    '
    socket.Listen ( ...
     
    Dim msgbuffer() As Byte System.Text.Encoding.UTF8.GetBytes("Hello")
     
    Dim clientsocket As System.Net.Sockets.Socket socket.Accept()
    clientsocket.Send(msgbuffer)
    clientsocket.Close()
     
     
    //C#‎.Net
    //socket = new ...
    //socket.Bind ( ...
    //socket.Listen ( ...
     
    byte[] msgbuffer System.Text.Encoding.UTF8.GetBytes("Hello");
     
    System.Net.Sockets.Socket clientsocket socket.Accept();
    clientsocket.Send(msgbuffer);
    clientsocket.Close(); 
    برای یک برنامه واقعی باید Accept را در یک حلقه تکرار کرد تا تمام درخواستهای همه کلاینتها پردازش شود.
    مثلاً کد زیر هر درخواستی را که برسد قبول میکند و یک پیغام Hello به ان ارسال میکند و مکالمه را پایان میدهد و مجدداً منتظر درخواست بعدی میشود.

    کد PHP:
    'VB.Net
    '
    socket = New ...
    'socket.Bind ( ...
    '
    socket.Listen( ...
     
    Dim msgbuffer() As Byte System.Text.Encoding.UTF8.GetBytes("Hello")
     
    Do
         
    Dim clientsocket As System.Net.Sockets.Socket socket.Accept()
         
    clientsocket.Send(msgbuffer)
         
    clientsocket.Close()
    Loop
     
     
    //C#‎.Net
    //socket = new ...
    //socket.Bind ( ...
    //socket.Listen ( ...
     
    byte[] msgbuffer System.Text.Encoding.UTF8.GetBytes("Hello");
     
    while (
    true)
    {
         
    System.Net.Sockets.Socket clientsocket socket.Accept();
         
    clientsocket.Send(msgbuffer);
         
    clientsocket.Close();

    با M.S.P Soft به دنياي برنامه نويسي وارد شويد[برای نمایش لینک باید عضو شوید. ]
  4. #14
    adminmsp
    مدیر کل و موسس سایت
    تاریخ عضویت
    1970 Jan
    محل سکونت
    M.S.P Soft
    نوشته ها
    1,588
    759
    419
    برای ارسال و دریافت اطلاعات، تنها فرمت مورد قبول در سطح سوکت، اطلاعات باینری خالص است، آرایه بایتی.
    وظیفه کد ما است که آیتم مورد نظر برای ارسال را Serialize به آرایه بایتی کند و پس از دریافت هم Deserialize کردن به دیتا بر عهده کد ما است.

    - برای این تبدیلات دیتاهای معمول مثل Integer و Double و... میتوان از کلاسهای System.IO.BinaryReader و System.IO.BinaryWriter استفاده کرد.

    - برای تبدیلات String هم میتوان از System.Text.Encoding.UTF8 استفاده کرد.

    - برای تبدیلات Image هم میتوان از کلاسس System.IO.MemoryStream و متدهای FromStream و Save استفاده کرد.

    - برای اشیای پیچیده و ترکیبی که تبدیلات آنها مشکل است میتوان از System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter استفاده کرد ولی این تبدیلات از تبدیلات مشابه فوق الذکر کندتر و حجیم تر هستند.

    و...

    Send
    =====
    این متد جهت ارسال اطلاعات استفاده میشود و چندین Overload دارد، یکی از کاملترین Overload های این متد چهار پارامتر میگیرد.

    کد PHP:
    buffer() As Byte
    offset 
    As Integersize As Integer
    socketFlags 
    As System.Net.Sockets.SocketFlags 
    -پارامتر اول خود آرایه بایتی است که باید ارسال شود.
    -پارامتر دوم ایندکس آیتم شروع در آرایه است که معمولاً عدد صفر است.
    -پارامتر سوم تعداد بایتهایی است که از محل مشخص شده باید ارسال شوند.
    -پارامتر آخر فلاگهای مشخصه ارسال است که ما گزینه None را انتخاب میکنیم.

    Receive
    =====
    یک Overload کامل از این متد هم سه پارامتر میگیرد.
    و یک عدد باز میگرداند، عدد مذکور میزان بایتی اطلاعات رسیده را نشان میدهد.
    این دستور باید در یک حلقه فراخانی شود و کد ما مدام گوش بزنگ رسیدن دیتای جدید باشد.

    کد PHP:
    buffer() As Byte
    size 
    As Integer
    socketFlags 
    As System.Net.Sockets.SocketFlags 
    - پارامتر اول آرایه خالی است که ما خودمان به متد مذکور میدهیم تا بع عنوان بافر اطلاعات رسیده را در آن بریزد.
    (البته خالی نه به معنای پر از صفر! خالی به معنای آرایه ای که محتویات جاری اش دیگر برای ما مهم نیست و آماده است تا اطلاعات جدید در آن ریخته شود.)

    - پارامتر دوم، اندازه ای از آرایه ای است که متد مذکور اجازه دارد از آن استفاده کند.

    - پارامتر آخر هم همانطور که گفتیم فلاگ های خاص نحوه دریافت و ارسال است که ما از گزینه None استفاده خواهیم کرد.


    اگر آرایه ای 10K بایتی ما بدهیم، لزومی به صبر برای پر شدن کل آرایه نیست و یک بسته 1 بایتی اطلاعات هم برسد، کافیست تا متد انجام شده و به انتها برسد.
    اگر بلوک بسته ای اطلاعات رسیده شده، بیشتر از حجم بافر ما باشد، تا حدی که بافرما اجازه دهد اطلاعات را دریافت میکنیم و مابقی را در اجرای بعدی Receive دریافت خواهیم کرد.

    منبع برنامه نويس
    با M.S.P Soft به دنياي برنامه نويسي وارد شويد[برای نمایش لینک باید عضو شوید. ]
  5. #15
    sosani2007
    كاربر عادي
    تاریخ عضویت
    2014 Jan
    نوشته ها
    3
    0
    0
    سلام
    ابم کار باعث میشه برنامه هنگ بکنه و هیچ کاری نشه بکنی
    من دنبالش رفتم می گم باید سوکت نویسی به روش اسنکرون باشه نه سنکرون
    یعنی قبل استفاده از سوکت باید اسنکرونش رو هم بنویسیم
    میشه ما رو با اون اشنا کنین؟
  6. #16
    3bald
    كاربر عادي
    تاریخ عضویت
    2015 Sep
    نوشته ها
    1
    0
    0
    سلام دوستان ببخشید تاریخ موضوع قدیمیه ولی سوال داشتم

    می خوام برنامه ای بنویسم مشکل دارم
    اول اینکه برنامه طبق تلنت پیش میره و من براش تایمر گزاشتم میخوام تایمر نداشته باشه و هرموقه که درخواستش اومد جواب منو بگیره
    دوم اینکه یک سری اطلاعات داخل اون دستگاه هست که من با تلنت میخونمشون میخوام داخل یک متغیر یا دیتا بیس ثبت بشه

    ممنون میشم کمکم کنید ...
صفحه 2 از 2 نخست 12
نمایش نتایج: از 11 به 16 از 16

اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

Content Relevant URLs by vBSEO 3.6.0 RC 2