به بيان ساده مي توان گفت كه سوكت به تركيب یک آدرس ماشين ( IP ) و یک شماره درگاه ( Port ) گفته مي شود. اين دو با هم و بصورت مكمل هم در آدرس يابي تحت شبكه به برنامه هاي كاربردي كمك مي كنند كه هر برنامه تنها packet ارسالي خود را و تنها از آدرس مورد نظرش بدست آورد يا به عبارت ديگر علاوه به بحث رساندن بسته به كامپيوتر مقصد رساندن آن به برنامه كاربدي مربوطه نيز لازم است.
در مدل کلاینت – سرور ، مبادلات زیر بین کلاینت و سرور رخ می دهد:
ابتدا برنامه سمت سرور را مي نويسم. در اين برنامه مي بايست يک پورت را باز کرده و به آن گوش دهيم و دريافتي را نمايش دهيم.
ابتدا مي بايست فضاي نامهاي زير را با استقاده از using به کامپايلر سي شارپ معرفي کنيم:
using System; using System.Net; using System.Net.Sockets; using System.Text;
اکنون متغيري به نام را به صورت سراسري و static تعريف مي کنيم (از آنجايي که متد Mainيک متد static است کليه متغيرها و توابع مورد استفاده در آن نيز بايد static باشند.)
متغيرها و توابعي هستند که در يک کلاس به طور مشترک بين کليه اشياء گرفته شده از آن کلاس وجود دارند نه اينکه به ازاي هر شيء يک نمونه از آن ايجاد شود. دسترسي به اين متغيرها از طريق نام کلاس ممکن خواهد بود.
يک شيء از کلاس سوکت به صورت سراسري و static ايجاد مي کنيم :
staticSocket sktListener;
در متد Mainاين سوکت را new مينکيم تا به آن حافظه اختصاص داده شود:
staticvoid Main()
{
sktListener = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
AddressFamily.InterNetwork به معناي اين است که از شبکه اي استفاده مي کنيم که داراي IP نسخه 4 است.
SocketType.Stream براي سوکت هايي است که مي خواهند به صورت Stream داده ها را تبادل کنند.
ProtocolType.Tcp که نوع پروتکل ما را مشخص مي کند.
اکنون مي بايد آدرس IP و يک Port به سوکت مان اختصاص دهيم:
IPEndPoint ipLocal = newIPEndPoint(IPAddress.Any, 1800); sktListener.Bind(ipLocal);
از آنجايي که اين برنامه در سمت سرور اجرا ميشود آدرس IP خاصي به آن نميدهيم و پورت 1800 را باز مي کنيم. کلاس IPEndPoint براي مشخص نمودن يک نود يا يک کامپيوتر در شبکه به کار ميرود.
متد Bind نود مشخص شده را به سوکت اختصاص مي دهد.
اکنون زمان گوش دادن به پورت است:
sktListener.Listen(100);
عدد 100 نشانه آن است که حداکثر 4 connection ميتوانند در صف قرار گيرند.
اگر در اين لحضه در command prompt دستور netstat –an را تايپ کنيد ميتوانيد ببينيد که پورت 1800 باز شده و در حال گوش دادن است.
حال ميبايد تقاضاي کانکت شدن کلاينت را بپذيريم:
sktListener = sktListener.Accept();
حال براي گرفتن داده ها، مي بايست يک بافرتعريف نماييم.
نکته: در سوکت پروگرمينگ، داده ها به صورت آرايه اي از بايت ها منتقل مي شوند. براي ارسال رشته هاي يونيکد و …. بايست آنها را کد گذاري کنيم. براي کد گذاري و کد گشايي از کلاس System.Text و متدهاي آن استفاده کنيم. مثلا دستور زير رشته salam را با فرمت Ascii به آرايه اي از بايت ها تبديل مي کند.
byte[] byt = Encoding.ASCII.GetBytes("salam");
و متد زير آن را رمزگشايي مي کند:
string str = Encoding.ASCII.GetString(byt);
ما عمل رمزنگاري را موقع ارسال داده ها و عمل رمز گشايي را موقع دريافت آنها انجام ميدهيم.
اکنون ميخواهيم داده ها را دريافت کرده و رمز گشايي کنيم:
byte[] buffer = newbyte[500]; sktListener.Receive(buffer); string Data = Encoding.ASCII.GetString(buffer);
حال مي توانيم داده ها را پردازش کنيم.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
staticSocket sktListener;
staticvoid Main(string[] args)
{
sktListener = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipLocal = newIPEndPoint(IPAddress.Any, 1800);
sktListener.Bind(ipLocal);
sktListener.Listen(100);
sktListener = sktListener.Accept();
byte[] buffer = newbyte[500];
sktListener.Receive(buffer);
sktListener.close();
}
کدهایی که تا به اینجا دیدیم برای ایجاد سوکت های همگام یا سنکرون بوده است. این سوکت ها در برنامه های ویندوز و کلا سیستم های مالتی تسک کاربردی ندارند. چرا که بالفرض در زمانی از متد accept استفاده نموده ایم، در این حالت برنامه تا رسیدن یک سوکت به آن قفل شده و قادر به انجام کاری نیست.
ايتدا يک سوکت تعريف مي کنيم.
Socket sktClient = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
حال سرور را به آن معرفي مي نماييم و به آن کانکت مي شويم:
sktClient.Connect("127.0.0.1", 1800);
اگر دوباره دستور netstat –an را در Command prompt تايپ کنيم مي بينيم که ارتباظ برقرار شده است. به شماره پورتها در آن دقت کنيد.
اکنون داده هاي ارسالي را آماده مي کنيم:
string str = "Hello Server...."; byte[] buffer = Encoding.ASCII.GetBytes(str);
داده ها را ارسال مي کنيم:
sktClient.Send(buffer);
و سوکت را ميبنديم :
sktClient.Close();
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
staticvoid Main(string[] args)
{
Socket sktClient = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sktClient.Connect("127.0.0.1", 1800);
string str = "Hello Server....";
byte[] buffer = Encoding.ASCII.GetBytes(str);
sktClient.Send(buffer);
sktClient.Close();
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Server1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static Socket ServerSock;
private void Form1_Load(object sender, EventArgs e)
{
ServerSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint SockAdd = new IPEndPoint(IPAddress.Any, 1050);
ServerSock.Bind(SockAdd);
ServerSock.Listen(100);
ServerSock = ServerSock.Accept();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
NetworkStream Serverstream = new NetworkStream(ServerSock);
byte[] buffer2 = new byte[100];
ServerSock.Receive(buffer2);
string Data = Encoding.ASCII.GetString(buffer2);
listBox1.Items.Add("Maryam: "+Data);
Serverstream.Flush();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
NetworkStream Serverstream = new NetworkStream(ServerSock);
byte[] buffer3 = new byte[100];
buffer3 = System.Text.Encoding.ASCII.GetBytes(textBox1.Text);
ServerSock.Send(buffer3);
Serverstream.Flush();
listBox1.Items.Add("Me: " + textBox1.Text);
textBox1.Clear();
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static Socket ClientSock;
private void Form1_Load(object sender, EventArgs e)
{
ClientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSock.Connect("127.0.0.1", 1050);
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
NetworkStream Clientstream = new NetworkStream(ClientSock);
byte[] buffer1 = System.Text.Encoding.ASCII.GetBytes(textBox1.Text);
ClientSock.Send(buffer1);
Clientstream.Flush();
listBox1.Items.Add("Me: "+ textBox1.Text);
textBox1.Clear();
}
}
private void button1_Click(object sender, EventArgs e)
{
byte [] buffer= new byte [100];
NetworkStream Clientstream=new NetworkStream (ClientSock );
ClientSock.Receive(buffer);
string Data = Encoding.ASCII.GetString(buffer);
listBox1.Items.Add("Server: "+ Data);
Clientstream.Flush();
}
}
}
با تشکر از جناب سعید جعفری
در دنیای بیپایان نرمافزارها و فایلهای دیجیتال، امنیت در دانلود و استفاده از آنها یک…
شرکت ایسوس یکی از پیشتازان در صنعت فناوری اطلاعات و الکترونیک است که در زمینه…
آیا شما هم به دنبال کار با کد های پاورشل برای هک هستید؟ در این…
این روزها که همه افراد به دنبال یک شغل پردرآمد می گردند، مشغول به کار…
خطای page isn’t available right now یکی از آزار دهنده ترین مشکلاتی است که کاربران…
ویندوز پاورشل چیست؟ پاورشل ابزاری قدرتمند به حساب می آید که همه افراد علاقه مند…
View Comments
تشکر بابت آموزش جناب جاهدی
خواهش می کنم محمد آقا
سلام.خیلی ممنون بابت توضیحاتتون.
من دوتا کد آخرتون رو که برای سرور و کلاینت هست توی دو تا پروژه جداسی شارپ کپی کردم.
بعدش اول سرورو ران میکنم بدش کلاینتو ران میکنم.دو تا فرم باز میکنه ولی چه تو فرم کلاینت چیزی بنویسم و باتن رو بزنم و چه تو فرم سرور چیزی بنویسم و باتن رو بزنم هیچ اتفاقی نمی افته.چرا؟؟؟؟؟؟؟
با سلام
من بک برنامه Socket نوشتم
مشکلی که من دارم این است که زمانی که Client به صورت ناگهانی قطع میشود(قطع شدن کابل و یا قطع شدن سیستم) سمت Server متوجه قطع شدن Client نمی شود و همچنان Client به صورت Connect باقی میماند.
از شما تقاضا دارم در صورت امکان اینجانب را راهنمایی نمایید.
با تشکر
ممنون از مطالب مفیدتان
داخل این لینک یک فیلم خوب سوکت هم وجود داره من دیدم خوب بود
http://www.aparat.com/v/d1bnZ
خیلی سایت خوب و مفیدی بود خیلی کمکم کرد ممنون
عالییییییییییییییییی بود
سلام خسته نباشید ممنون به خاطر اموزشتون من میخواستم بدونم چطور اون پیامی که از طرف کلاینت میاد تو سرور نمایش داده بشود
سلام میشه اینو پی دی اف کنید توروخدا خیلی به دردم میخوره
واژه رمزنگاری صیح نمی باشد.
در اینجا شما کد گذاری می کنید که زمین تا آسمان بارمز نگاری متفاوت است.
خیلی خوب بود، سپاس.