آموزش برنامه نویسی تحت شبکه درسی شارپ FtpWebRequest,SmtpClient,HttpClient,TcpClient,...
C# Uri
کار با کلاس و ابجکت Uri در سی شارپ
Program.cs
var resource = "http://webcode.me:80/"; var resource2 = "http://webcode.me/index.html"; var resource3 = "http://www.webcode.me/name=Peter&age=23"; var path = new Uri(resource); var path2 = new Uri(resource2); var path3 = new Uri(resource3); Console.WriteLine(path.Port); Console.WriteLine(path.Host); Console.WriteLine(path.Authority); Console.WriteLine(path.LocalPath); Console.WriteLine(path.Scheme); Console.WriteLine("-----------------------"); Console.WriteLine(path2.Port); Console.WriteLine(path2.LocalPath); Console.WriteLine("-----------------------"); Console.WriteLine(path3.Authority); Console.WriteLine(path3.PathAndQuery); Console.WriteLine(path3.Query); Console.WriteLine(path3.AbsolutePath); Console.WriteLine(path3.AbsoluteUri);
در این مثال ما با کلاس uri کار می کنیم
var resource = "http://webcode.me:80/"; var resource2 = "http://webcode.me/index.html"; var resource3 = "http://www.webcode.me/name=Peter&age=23";
ما به مسیر را مشخص می کنیم
var path = new Uri(resource); var path2 = new Uri(resource2); var path3 = new Uri(resource3);
با استفاده از مسیر ها منابع وب ایجاد می کنیم
Console.WriteLine(path.Port); Console.WriteLine(path.Host); Console.WriteLine(path.Authority); Console.WriteLine(path.LocalPath); Console.WriteLine(path.Scheme);
در اینجا بخش های مختلف uri را چاپ می کنیم
$ dotnet run 80 webcode.me webcode.me / http ----------------------- 80 /index.html ----------------------- www.webcode.me /name=Peter&age=23 /name=Peter&age=23 http://www.webcode.me/name=Peter&age=23
C# UriBuilder
uri builder یک روش راحت برای اصلاح uri هست
Program.cs
using System.Net; var uriBuilder = new UriBuilder(); uriBuilder.Scheme = "http"; uriBuilder.Host = "webcode.me"; uriBuilder.Path = "/"; Uri uri = uriBuilder.Uri; WebRequest request = WebRequest.Create(uri); using WebResponse response = request.GetResponse(); var headers = response.Headers; Console.WriteLine(headers);
برای مثال اینجا به سادگی در خواست get را به منبع می دهیم
var uriBuilder = new UriBuilder(); uriBuilder.Scheme = "http"; uriBuilder.Host = "webcode.me"; uriBuilder.Path = "/"; Uri uri = uriBuilder.Uri;
ما یک uri با uri builder می سازیم
WebRequest request = WebRequest.Create(uri);
We create a web request to the Uri using WebRequest
.
using WebResponse response = request.GetResponse();
With the GetResponse
method, we make a synchronous request to the resource specified by the Uri
.
var headers = response.Headers; Console.WriteLine(headers);
از پاسخ هدر ها را میگیریم و چاپ می کنیم
$ dotnet run Server: nginx/1.6.2 Date: Wed, 10 Feb 2021 12:42:16 GMT Connection: keep-alive ETag: "5d32ffc5-15c" Access-Control-Allow-Origin: * Accept-Ranges: bytes Content-Type: text/html Content-Length: 348 Last-Modified: Sat, 20 Jul 2019 11:49:25 GMT
هدر ها به درخواست ما پاسخ می دهند
C# HttpWebRequest
HttpWebRequest
برای ساخت request های http استفاده می شود
Program.cs
using System.Net; var uri = new Uri("http://webcode.me"); HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri); using var response = (HttpWebResponse) request.GetResponse(); using var stream = response.GetResponseStream(); using var reader = new StreamReader(stream); var data = reader.ReadToEnd(); Console.WriteLine(data);
در اینجا ما یک درخواست get با استفاده از HttpWebRequest
ایجاد کردیم
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri);
HttpWebRequest
ساخته شد
using var response = (HttpWebResponse) request.GetResponse();
روش GetResponse همزمان یک درخواست ارسال می کند و یک پاسخ از سرور می گیرد
using var stream = response.GetResponseStream(); using var reader = new StreamReader(stream);
ما respone را می خوانیم
var data = reader.ReadToEnd(); Console.WriteLine(data);
ما کل دیتا ها را می خوانیم و چاپ می کنیم
C# hostname
روش Dns.GetHostName نام کامپیوتر local را دریافت می کند
Program.cs
using System.Net; var hostName = Dns.GetHostName(); Console.WriteLine($"Hostname: {hostName}");
کد بالا نام کامپیوتر host شما را چاپ می کند
C# GetHostEntry
با این روش می توانیم ip میزبان را بدست بیاوریم
Program.cs
using System.Net; var name = "wikipedia.org"; IPHostEntry host = Dns.GetHostEntry(name); var addresses = host.AddressList; foreach (var address in addresses) { Console.WriteLine($"{address}"); }
کد بالا ای پی وب سایت wikipedia.org را چاپ می کند
var addresses = host.AddressList;
AddressList
یک پراپرتی است که لیست ای پی های مرتبط را دریافت می کند
$ dotnet run 2620:0:862:ed1a::1 91.198.174.192
خروجی شامل یک آدرس IPv6 و IPv4 است.
C# Ping
پینگ کردن یک ای پی برای تست سالم بودن آن سرور تست می شود
Program.cs
using System.Net.NetworkInformation; using var ping = new Ping(); PingReply reply = ping.Send("192.168.0.23", 100); if (reply.Status == IPStatus.Success) { var msg = @$"Status: {reply.Status} IP Address:{reply.Address} Time:{reply.RoundtripTime}ms"; Console.WriteLine(msg); } else { Console.WriteLine(reply.Status); }
ما ای پی خود را پینگ می کنیم(local)
PingReply reply = ping.Send("192.168.0.23", 100);
متد send یک پیام ICMP ارسال می کند و پارامتر دوم timeout هست
$ dotnet run Status: Success IP Address:192.168.0.23 Time:4ms
C# Socket
سوکت ها برای ایجاد ارتباط بین برنامه مشتری و برنامه سرور استفاده می شوند.
The System.Net.Sockets.Socket
class implements the Berkeley sockets interface.
Program.cs
using System.Text; using System.Net; using System.Net.Sockets; string server = "webcode.me"; int port = 80; var request = $"GET / HTTP/1.1\r\nHost: {server}\r\nConnection: Close\r\n\r\n"; Byte[] requestBytes = Encoding.ASCII.GetBytes(request); Byte[] bytesReceived = new Byte[256]; 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(requestBytes, requestBytes.Length, 0); int bytes = 0; var sb = new StringBuilder(); do { bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0); sb.Append(Encoding.ASCII.GetString(bytesReceived, 0, bytes)); } while (bytes > 0); Console.WriteLine(sb.ToString());
توجه کنید برنامه نویسی socket سطح پایین دارد
string server = "webcode.me"; int port = 80;
سرور و پورت را تعریف می کنیم
var request = $"GET / HTTP/1.1\r\nHost: {server}\r\nConnection: Close\r\n\r\n";
ما یک درخواست get تعریف می کنیم
Byte[] requestBytes = Encoding.ASCII.GetBytes(request);
ما داده های متنی خود را به byte تبدیل می کنیم
Byte[] bytesReceived = new Byte[256];
این آرایه بایت برای داده های سرور است
IPHostEntry hostEntry = Dns.GetHostEntry(server);
با این کد ای پی دامنه را پیدا می کنیم
var ipe = new IPEndPoint(hostEntry.AddressList[0], port);
ما یک IPEndPont ایجاد می کنیم
using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ما اینجا از IPv4 و پروتوکل TCP استفاده می کنیم
socket.Connect(ipe);
ما به شبکه متصل می شویم
if (socket.Connected) { Console.WriteLine("Connection established"); } else { Console.WriteLine("Connection failed"); return; }
بررسی می کنیم ایا با موفقیت وصل شده ایم
socket.Send(requestBytes, requestBytes.Length, 0);
یک request به سرور با متد Send می فرستیم
do { bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0); sb.Append(Encoding.ASCII.GetString(bytesReceived, 0, bytes)); } while (bytes > 0);
ما دادهها را از سوکت با روش Receive دریافت میکنیم. بایتها را با روش GetString به متن تبدیل میکنیم و دادههای متنی را به StringBuilder اضافه میکنیم.
Console.WriteLine(sb.ToString());