"> ارسال و دریافت داده با استفاده از Socket

ارسال و دریافت داده با استفاده از Socket در سی شارپ

Socket در سی شارپ

این مقاله نحوه ی ارسال و دریافت داده (Socket در سی شارپ) از طریق TCP/IP با استفاده از Socket در چارچوب .Net را نشان میدهد. در اینجا متد های Socket.Send و Socket.Receive وجود دارند که باهم برسی میکنیم ، در ارتباطات شبکه قراردادهایی استفاده می شود تحت عنوان Protocol ,پروتکولهای مختلفی ایجاد شده اما در ارتباطات اینترنتی و شبکه هایی که ارتباط ۲ طرفه است بیشتر از نوع( TCP/IP ) استفاده میشه که اساس اون به صورت خیلی مختصرSocket.Send و Socket.Receive را در این مقاله برسی میکنیم.

متد Socket.Send

متد ارسال داده ها را از buffer به یک socket متصل ارسال میکند. زمانی که شما متد ارسال را صدا میزنید شماره ی بایتی که ارسال شده را بازمیگرداند. اما به این معنا نیست که بایت توسط دریافت کننده دریافت شده است. تنها به این معناست که که داده ها در یک Socket buffer ذخیره شده است و Socket تلاش برای ارسال آن میکند. اگر که Socket پر باشد یک خطای WouldBlock ظاهر میشود. باید مدتی صبر کنید و سپس دوباره تلاش برای ارسال داده ها کنید.

متد های زیر سایز بایت های ذخیره شده در buffer از موقعیت offset قبلی را ارسال میکند.

اگر عملیات بیش از میلی ثانیه باقی بماند یک استثناء ارسال میشود.

public static void Send(Socket socket, byte[] buffer, int offset, int size, int timeout)   
{   
int startTickCount = Environment.TickCount;   
int sent = 0;  // How many bytes is already sent   
do
{   
if (Environment.TickCount > startTickCount + timeout)   
throw new Exception("Timeout.");   
try
{   
sent += socket.Send(buffer, offset + sent, size - sent, SocketFlags.None);   
}   
catch (SocketException ex)   
{   
if (ex.SocketErrorCode == SocketError.WouldBlock ||   
ex.SocketErrorCode == SocketError.IOPending ||   
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)   
{   
// Socket buffer is probably full, wait and try again   
Thread.Sleep(30);   
}   
else   
throw ex;  // Any serious error occurr   
}   
} while (sent < size);   
}

برای صدا زدن متد ارسال از قطعه کد زیر استفاده کنید.( با این فرض که متد ارسال استاتیک در کلاس MyClass تعریف شده باشد). TCP/IP Socket میتواند با استفاده از کلاس TcpClients دریافت شود. از خصوصیت TcpClient.Client برای دریافت Underlying Socket استفاده کنید. (این خصوصیت از .Net Framework 2.0 منتشر شد).

Socket socket = tcpClient.Client;   
string str = "Hello world!";   
try   
{ // Sends the text with timeout 10s   
MyClass.Send(socket, Encoding.UTF8.GetBytes(str), 0, str.Length, 10000);   
}   
        catch (Exception ex) { /* ... */ }

 متد Socket.Receive

متد دریافت داده ها را از یک bound Socket به buffer تان دریافت میکند. متد شماره ی بایت دریافت شده را بازمیگرداند. اگر Socket buffer خالی باشد یک خطای WouldBlock ظاهر میشود. باید داده ها را بعدا دریافت کنید. متد زیر تلاش به دریافت اندازه ی بایت buffer به موقعیت offset میکند. اگر عملیات بیش از میلی ثانیه طول بکشد یک استثناء ارسال میشود.

public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)   
{   
int startTickCount = Environment.TickCount;   
int received = 0;  // How many bytes is already received   
do 
{   
if (Environment.TickCount > startTickCount + timeout)   
throw new Exception("Timeout.");   
try 
{   
received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);   
}   
catch (SocketException ex)   
{   
if (ex.SocketErrorCode == SocketError.WouldBlock ||   
ex.SocketErrorCode == SocketError.IOPending ||   
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)   
{   
// Socket buffer is probably empty, wait and try again   
Thread.Sleep(30);   
}   
else   
throw ex;  // Any serious error occurr   
}   
} while (received < size);

متد دریافت را با استفاده از کدی نظیر زیر فراخوانی کنید :

Socket socket = tcpClient.Client;  
byte[] buffer = new byte[12];  // Length of the text "Hello world!"  
try  
{ // Receive data with timeout 10s  
  MyClass.Receive(socket, buffer, 0, buffer.Length, 10000);  
  string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);  
}  
catch (Exception ex) { /* ... */ }

 

  • پسورد: www.mspsoft.com
داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    مهدی صفری پاسخ

    سلام
    مرسی از آموزش مفیدتون. می خواستم بپرسم می تونید آموزش ارسال دیتا از طریق تلفن اندرویدی به دیتابیس یک اپلیکیشن ویندوزی تحت شبکه Local را ارائه فرمایید.