برنامه نویسی سوکت در سی شارپ (و نحوه کار با سوکت ها در #C)
در این مقاله نحوه کار با سوکت ها در سیشارپ را با هم بررسی خواهیم کرد سپس در قالب 3 درس ویدیویی، برنامه نویسی سوکت در سی شارپ را به راحتی می آموزید.
پروتکل های شبکه
TCP وIP پروتکل هایی هستند که توسط دستگاه ها برای برقراری ارتباط از طریق اینترنت و اکثر شبکه های محلی استفاده می شود. البته TCP قابل اعتمادتر است، بررسی خطای جامع تر و به منابع بیشتری نیاز دارد. این پروتکل ها توسط سرویس هایی مثل HTTP، SMTP یا FTP استفاده می شوند. UDP خیلی قابل اعتماد نیست، بررسی خطای محدودی دارد و به منابع کم تری نیاز دارد. توسط سرویس هایی مثل VoIP استفاده می شود.
سوکت
در برنامه نویسی، سوکت (Socket) نقطه پایانی ارتباط بین دو برنامه در حال اجرا در یک شبکه است. در دات نت، کلاس سوکت مجموعه ای غنی از متد ها و ویژگی ها را برای ارتباطات شبکه فراهم می کند. این ویژگی کمکمان می کند تا هم انتقال داده به سبک همزمان و هم ناهمزمان را انجام بدهیم.
هر زبان برنامه نویسی را از اینجا رایگان یاد بگیرید
نمونه سوکت UDP سیشارپ
UDP یک پروتکل ارتباطی است که بسته های مستقل را بدون ضمانت ورود و بدون تضمین سفارش تحویل بر روی شبکه ارسال می کند. یکی از سرویس هایی که از UDP استفاده می کند،Quote of the Day (QOTD) است.
Program.cs
using System.Text;
using System.Net;
using System.Net.Sockets;
string server = “djxmmx.net”;
int port = 17;
byte[] data = new byte[0];
IPHostEntry hostEntry = Dns.GetHostEntry(server);
var ipe = new IPEndPoint(hostEntry.AddressList[0], port);
using var socket = new Socket(AddressFamily.InterNetworkV6,
SocketType.Dgram, ProtocolType.Udp);
socket.ReceiveTimeout = 5000;
socket.SendTimeout = 2000;
socket.SendTo(data, ipe);
byte[] data2 = new byte[1024];
EndPoint remote = (EndPoint)ipe;
int n = socket.ReceiveFrom(data2, ref remote);
Console.WriteLine($”Message size: {n}”);
Console.WriteLine($”Messaged received from: {remote}”);
Console.WriteLine(Encoding.ASCII.GetString(data2, 0, n));
این برنامه یک برنامه کلاینت یا کاربر ایجاد می کند که به یک سرویس QOTD متصل می شود.
string server = “djxmmx.net”;
int port = 17;
این سرور و پورتی است که سرویس QOTD در آن مشاهده می شود. توجه داشته باشید که چنین خدماتی اغلب کوتاه مدت هستند.
byte[] data = new byte[0];
ما یک پیام خالی به سرور ارسال می کنیم.
IPHostEntry hostEntry = Dns.GetHostEntry(server);
Dns.GetHostEntry نام هاست یا میزبان یا آدرس IP را به یک نمونه IPHostEntry اختصاص می دهد. این یک کلاس Container دات نت برای اطلاعات آدرس میزبان اینترنت است.
using var socket = new Socket(AddressFamily.InterNetworkV6,
SocketType.Dgram, ProtocolType.Udp);
سوکت ایجاد می شود. ما فرایند آدرس دهی، نوع سوکت و نوع پروتکل را پشت سر می گذاریم.
socket.ReceiveTimeout = 5000;
socket.SendTimeout = 2000;
زمان بندی دریافت داده های ارسالی را تنظیم می کنیم.
socket.SendTo(data, ipe);
داده ها را (که در این مورد خالی است) با SendTo به نقطه پایانی ارسال می کنیم.
byte[] data2 = new byte[1024];
در این جا پیام پاسخ را ذخیره می کنیم.
int n = socket.ReceiveFrom(data2, ref remote);
این متد ReceiveFromیک دیتاگرام را در بافر داده دریافت و نقطه پایانی را ذخیره می کند. و تعداد بایت های دریافتی را برمی گرداند.
Console.WriteLine($”Message size: {n}”);
Console.WriteLine($”Messaged received from: {remote}”);
Console.WriteLine(Encoding.ASCII.GetString(data2, 0, n));
اندازه پیام را چاپ و آدرس و داده های دریافتی را حذف می کنیم.
$ dotnet run
Message size: 73
Messaged received from: [2001:470:e312:10::10]:17
“Take what you can, give nothing back…”
– Pirates Of The Caribbean
درخواست HTTP HEAD سوکت سی شارپ
درخواست HEAD یک درخواست HTTP GET بدون بدنه پیام است. سرصفحه درخواست یا پاسخ حاوی ابرداده است، مثل نسخه پروتکل HTTP یا نوع محتویات (Content Type).
Program.cs
using System.Text;
using System.Net;
using System.Net.Sockets;
string server = “webcode.me”;
int port = 80;
var request = “HEAD / HTTP/1.0rnrn”;
byte[] bReq = Encoding.ASCII.GetBytes(request);
byte[] bRec = new byte[8192];
IPHostEntry hostEntry = Dns.GetHostEntry(server);
var ipe = new IPEndPoint(hostEntry.AddressList[0], port);
using var socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipe);
if (socket.Connected)
{
Console.WriteLine(“Connection established”);
}
else
{
Console.WriteLine(“Connection failed”);
return;
}
socket.Send(bReq, bReq.Length, 0);
int n = socket.Receive(bRec, bRec.Length, 0);
Console.WriteLine(Encoding.ASCII.GetString(bRec, 0, n));
در مثال کد، درخواست HEAD را به webcode.me ارسال می کنیم.
string server = “webcode.me”;
int port = 80;
این نام سرور و شماره پورت است.
string request = “HEAD / HTTP/1.0rnrn”;
درخواست هد با دستور HEAD و سپس URL منبع و نسخه پروتکل HTTP صادر می شود. توجه داشته باشید که rn کاراکتر ها بخشی واجب از فرآیند ارتباط هستند.
using var socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
پروتکل HTTP ( HTTP/0.9تاHTTP/2 ) مبتنی بر TCP است.
if (socket.Connected)
ما می توانیم بررسی کنیم که آیا به کمک ویژگی Connected با موفقیت وصل شده ایم یا خیر.
socket.Send(bReq, bReq.Length, 0);
ما داده ها را با Send ارسال می کنیم.
int n = socket.Receive(bRec, bRec.Length, 0);
Console.WriteLine(Encoding.ASCII.GetString(bRec, 0, n));
ما داده های هدر را دریافت و چاپ می کنیم.
$ dotnet run
Connection established
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 21 Sep 2022 17:43:39 GMT
Content-Type: text/html
Content-Length: 394
Last-Modified: Sun, 23 Jan 2022 10:39:25 GMT
Connection: close
ETag: “61ed305d-18a”
Accept-Ranges: bytes
درخواست HTTP GET سوکت سی شارپ
متد HTTP GET نمونه ای از منبع مشخص شده را درخواست می کند. درخواست هایی که از متد GET استفاده می کنند فقط باید داده ها را بازیابی کنند.
Program.cs
using System.Text;
using System.Net;
using System.Net.Sockets;
string server = “webcode.me”;
int port = 80;
string request = $”GET / HTTP/1.1rnHost: {server} rnConnection: Closernrn”;
Byte[] bReq = Encoding.ASCII.GetBytes(request);
Byte[] bRec = new Byte[1024];
IPHostEntry hostEntry = Dns.GetHostEntry(server);
var ipe = new IPEndPoint(hostEntry.AddressList[0], port);
using var socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipe);
if (socket.Connected)
{
Console.WriteLine(“Connection established”);
}
else
{
Console.WriteLine(“Connection failed”);
return;
}
socket.Send(bReq, bReq.Length, 0);
int n = 0;
var sb = new StringBuilder();
do
{
n = socket.Receive(bRec, bRec.Length, 0);
sb.Append(Encoding.ASCII.GetString(bRec, 0, n));
}
while (n > 0);
Console.WriteLine(sb);
این مثال صفحه اصلی webcode.me را با استفاده از درخواست GET می خواند.
string request = $”GET / HTTP/1.1rnHost: {server} rnConnection: Closernrn”;
ما یک درخواست GET ساده برای سوکت می نویسیم.
do
{
n = socket.Receive(bRec, bRec.Length, 0);
sb.Append(Encoding.ASCII.GetString(bRec, 0, n));
}
while (n > 0);
از آن جایی که نمی توانیم اندازه پاسخ را تعیین کنیم، از یک حلقه do/whileبرای خواندن پاسخ به صورت تکهای استفاده می کنیم .
اگر با جزوه بهتر یاد می گیرید دانلود کنید: آموزش کامل سی شارپ با جزوه PDf رایگان
دروس ویدیویی سوکت در سی شارپ
در ادامه دانلود کنید: آموزش صفر تا صد سی شارپ