ارسال و دریافت اطلاعات با استفاده از Socket

در این مقاله نحوه ارسال و دریافت اطلاعات توسط Socket را شرح خواهیم داد

ارسال و دریافت اطلاعات با استفاده از Socket

متد ارسال توسط Socket :

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

متدی که در ادامه مشاهده میکنید , اندازه byte ذخیره شده در buffer را از offset position ارسال میکند .اگر عملیات حتی 1 ثانیه بیشتر از زمان تعیین شده به طول بیانجامد کل عملیات ارسال متوقف میشود و پس از مدتی مجدد ارسال میشود .

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);  
}  

برای فراخوانی متد ارسال از کد زیر استفاده کنید , . Socket مربوط به TCP/IP می تواند خاصیت  TcpClient  را به دست  آورد.

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

متد دریافت , اطلاعات را از bound Socket موجود در buffer شما دریافت می کند .این متد نیز تعدادی byte دریافت می کند و اگر Socket buffer خالی باشد پیغام خطای WouldBlock را نمایش می دهد و شما باید اندکی بعد مجدد این متد را فراخوانی کنید .متدی که در ادامه مشاهده می کنید سعی در دریافت اندازه byte داخل buffer از offset position دارد .

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) { /* ... */ }