c# in urdu

Posted on at


فهرست
مقدمه :...............................................................................................................................................................4
5............................................................................................................................................... Socket تعريف
برنامه نويسي اتصال گرا)6................................................................................................................... (TCP
نحوه ي ساختن كانكشن مجازي..................................................................................................................12
ساختن سوكت)14..............................................................................................................................(Socket
21.............................................................................................................Client , Server برنامه كاربردي
25............................................................... (Connectionless Sockets) برنامه نويسي بدون اتصال
31.......................................................................................................SetSocketOption()پارامتر هاي
مديريت Errorهاي چندگانه.....................................................................................................................41
45................................................................................................................................. چيست؟Broad Cast
50.....................................................................................................................................................MultiCast
56.............................................................................................................................................................SMTP
56..................................................................................................Microsoft Virtual PC كار با برنامه
نحو ه ي ايجاد كردن شبكه...........................................................................................................................54
58.....................................................................................................................................Mail Server ايجاد
برنامه هاي ارسال 61............................................................................................................................ Email
75........................................................................................................ Sockets Helper Classes استفاده از
برنامه دريافت 78..................................................................................................................(POP3)Email
85.....................................................................................................................................................Remoting

Socket } تعريف
در شبكه هاي كامپيو تري ، برنامه هاي متعددي در يك زمان با يكديگر مرتبط مي گردند.
زمانيكه چندين برنامه بر روي يك كامپيوتر فعال مي گردند پروتكل TCP/IPمي بايست از
روشي به منظور تمايز يك برنامه از برنامه ديگر استفاده نمايد بدين منظور از سوكت براي مشخص
نمودن يك برنامه خاص استفاده مي گردد.
( Socket) سوكت
سوكت ، تركيبي از يك آدرس IPو پورت ) TCPاتصال گرا( و يا پورت ) UDPبدون اتصال(
است. يك برنامه ، سوكتي را با مشخص نمودن آدرس IPمربوط به كامپيوتر و نوع سرويس
) TCPيا (UDPو پورتي كه نشان دهنده برنامه است ، مشخص مي نمايد آدرس IPموجود در
سوكت امكان آدرس دهي كامپيوتر مقصد را فراهم و پورت مربوطه ، برنامه اي را كه داده ها
براي آن ارسال مي شود را مشخص مي كند.
در پروتكل TCPبراي به رسميت شناختن پروتكل هاي مختلفي كه بر روي يك ماشين در حال
اجرا هستند را ه حل زير ارئه مي شود
Port Number
هر پروسه اي براي تقاضاي بر قراري ارتباط با پروسه اي ديگر روي شبكه ، يك شماره شناسايي
براي خود بر مي گزيند. به اين شماره شناسايي آدرس پورت Port Numberگفته مي شود
)براي در ك بهتر اين موضوع مي توانيد به كتاب مرجع كامل ضد امنيت شبكه توسط امير آشتياني
مراجعه كنيد{
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
برنامه نويسي اتصال گرا)(TCP
مزيت بزرگ كتابخانه .netداشتن IPآدرس و Portها و به كار بردن Handleهاست
دو كلاس در ( System.Net) NameSpaceوجود دارد. كه داراي نوع هايي مختلف از
مي با .شدIP Address هايHandle
IPAddress 1-
IPEndPoint 2-
شي IPAddressبراي ن ام يش دادن يك IP Addressمنفرد مي باشد. اين شي داراي متد
هاي مختلفي براي نمايش IP Addressمي باشد.
سازنده ) (Constructorپيش فرض شي IP Addressبه صورت زير مي باشد.
Public IPAddress (Long address)
شي IPAddressداراي متدهاي مختلفي به شرح زير مي باشد.
METHOD DESCRIPTION
دو تا IPرا با هم مقايسه مي كند. Equals
مقدار درهم شده اي )(Hashرا براي شي IPAddressبر مي گرداند. GetHashCode
نمونه اي از يك نوع IPAdressداخلي را بر مي گرداند GetType
بايتهاي IPAddressيك Hostرا به بايتهاي آدرس يك شبكه ب ت ديل مي .كند HostToNetworkOrder
نشان مي دهد كه آيا IPAdressمطرح شده يك Loopbackآدرس است يا نه IsLoopBack
به بايتهاي آدرس يك شبكه را به بايتهاي يك Hostتبديل مي كند. NetworkToHostOrder
يك رشته را به يك IPAddressتيدبل مي كند. Parse
براي نمايش يك IPAddressبه يك رشته استفاده مي شود . ToString
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
)( Parsمتدي است كه اغلب در داخل يك IPAddressاستفاده مي شود
IPAddress newaddress = IPAddress.Parse("192.168.0.1");
اين غالب به شما اجازه مي دهد كه فرمت Stringرا به يك غالب استاندارد با نقطه جدا كننده
تبديل مي كند.
همچنين كلاس IPAddressبراي شما چهار فيلد Readonlyبراي نمايش IPهاي خاص
ارائه مي دهد.
: Anyبراي نمايش IPآدرس ها در يك سيستم محلي) (Localاستفاده مي شود)براي تست
برنامه مي تونيد از اين استفاده كنيد (
:Broacastبراي نمايش يك آي پي Broad Castدر يك سيستم محلي
:LoopBackبراي نمايش آدرس Loop Backسيستم استفاده مي شود)(127.0.0.1
:Noneبراي نمايش ندادن رابط شبكه در يك سيستم
در ادامه با اين پارمتر ها بيشتر آشنا مي شويد.
مثال زير چگونگي استفاده از فيلد هاي بالا را نشان مي دهد
using System.Net;
namespace test
{
class Program
{
static void Main(string[] args)
{
IPAddress test1 = IPAddress.Parse("192.168.0.1");
IPAddress test2 = IPAddress.Loopback;
IPAddress test3 = IPAddress.Broadcast;
IPAddress test4 = IPAddress.Any;
IPAddress test5 = IPAddress.None;
IPHostEntry ihe =
Dns.GetHostByName(Dns.GetHostName());
IPAddress myself = ihe.AddressList[0];
if (IPAddress.IsLoopback(test2))
Console.WriteLine("The Loopback address is:{0}",
test2.ToString());
else
Console.WriteLine("Error obtaining the loopback address");
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
Console.WriteLine("The local IP address is :{0}\n",
myself.ToString());
if (myself == test2)
Console.WriteLine("The loopback address is the A same as local
address", myself.ToString());
else
Console.WriteLine("loopback address is not the local
address.\n");
Console.WriteLine("the test address is :{0}",
test1.ToString());
Console.WriteLine("broadcast address:{0}", test3.ToString());
Console.WriteLine("the any address is:{0}", test4.ToString());
Console.WriteLine("the none address is:{0}",
test5.ToString());
}
}
}
خروجي به شكل زير مي باشد.
The Loopback address is:127.0.0.1
The local IP address is :127.0.0.1
.loopback address is not the local address
the test address is :192.168.1.1
broadcast address:255.255.255.255
the any address is:0.0.0.0
the none address is:255.255.255.255
متد هاي GetHostNameو GetHostByNameآي پي يك سيستم محلي را با ساختن يك
شي IPHostEntryمعين مي كند.
Object) IPHostEntryاي( است كه داراي جزئيات زيادتري مي باشد.
اما براي شروع كافي كه خاصيت AddressListرا ياد بگيريد. AddressListآرايه اي
از اشياي IPAddressاست ، كه مي توانييم تمامي IPهاي يك سيستم را در آن ذخيره كنيم.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
در Anyآدرس 0.0.0.0نمايش داده شده است اين آدرس بيشتر زماني استفاده مي شود كه
سيستم شما داراي يك IPنمي باشد و شما مي توانيد با استفاده از اين روش به سيستم خود يك
.
 ا+&*ص دهNull Ip Address
:Noneآدرس آن 255.255.255.255مي باشد ، وقتي استفاده مي شود كه سوكت شما
ساختگي باشد.
IPEndPoint
شي IPEndPointبراي نمايش يك IPو Portتركيب شده با هم استفاده مي شود .
يك IPEndPointزماني استفاده مي شود كه به يك Socketبا آدرس محلي و يا به يك
آدرس دور متصل شويد .
دو تا ) (Constructorبراي ساختن شي IPEndPointاستفاده مي شود
IPEndPoint(long address, int port)
IPEndPoint(IPAddress address, int port)
هر دو سازنده از دو پارامتر يكي IPو ديگري يك عدد صحيح كه شماره پورت مي باشد استفاده
مي كنند.
IPEndPointداراي متد هاي زير مي باشد.
METHOD DESCRIPTION
يك EndPointبه شكل يك سوكت آدرس را مي سازد. Create
دو تا IPEndPointرا با هم مقايسه مي كند. Equals
مقدار Hashشده را براي شي IPEndPointبرمي گرداند. GetHashCode
يك نمونه از IPEndpointرا بر مي گرداند. GetType
يك نمونه سوكت آدرس از نوع IPEndPointرا مي سازد كه حاوي اطلاعاتي راجع
. مي باشدIPEndPoint
Serialize
IPEndPointرا به يك رشته براي نمايش تبديل مي كند. ToString
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
System.net ؛NameSpace كلاس خاصي است كه در داخلSocketAddress كلاس
وجود دارد.
آن براي نمايش يك نسخه از serializedدر شي IPEndPointمي باشد
فرمت كلاس SocketAddressبه شكل زير مي باشد .
AddressFamily بايت براي نمايش1
1بايت براي نمايش اندازه اشيا
2بايت براي نمايش شماره پورت اشيا
بايت هاي باقيمانده هم براي نمايش IPآدرس يك سيستم است
شما مي توانيد خصوصيات داخلي IPEndPointرا به شكل زير تنظيم كنيد.
: Addressخصوصيات يك IPرا تنظيم) ( Setويا دريافت ) (Getمي كند
: AddressFamilyنام IPآدرس را مي گيرد.
:Portشماره پورت TCPيا UDPرا تنظيم مي كند.
هر خصوصيت مي تواند اطلاعاتي در باره قسمت هاي اختصاصي اشيا را استخراج كند
IPو Portجز خصوصيا ت اختصاصي وداخلي در شي IPEndPointبه حساب مي آيند.
IPEndPointداراي د و متد ReadOnlyمي باشد كه شامل
: MaxPortبيشترين مقداري كه مي توان براي يك پورت تعيين كرد.
: MinPortكمترين مقداري كه مي توان براي يك پورت تعيين كرد.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
به مثال زير توجه كن .يد
IPAddress test = IPAddress.Parse("192.168.1.1");
IPEndPoint ie = new IPEndPoint(test, 8000);
Console.WriteLine("the IPEndPoint is : {0}", ie.ToString());
Console.WriteLine("the Address Family is :{0}",
ie.AddressFamily);
Console.WriteLine("the address is: {0}, And the A port is
:{1}\n", ie.Address, ie.Port);
Console.WriteLine("the min port number is :{0}",
IPEndPoint.MinPort);
Console.WriteLine("the max port number is :
{0}",IPEndPoint.MaxPort);
ie.Port = 80;
Console.WriteLine("The change IPEndPoint value a is:{0}",
ie.ToString());
SocketAddress sa = ie.Serialize();
Console.WriteLine("the socket address is:{0}", sa.ToString());
خروجي برنامه به صورت زير مي باشد.
the IPEndPoint is : 192.168.1.1:8000
the Address Family is :InterNetwork
the address is: 192.168.1.1, And the A port is :8000
the min port number is :0
the max port number is : 65535
The change IPEndPoint value a is:192.168.1.1:80
the socket address is:InterNetwork:16:{0,80,192,168,1,1,0,0,0,0,0,0,0,0}
Press any key to continue. . . .
اين برنامه همچنين به شما اجاز ه مي دهد بدون آنكه يك شي جديد بسازيد مقدا ر پورت را تغيير
ie.Port=80; . دهيد
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
}مثال: با توجه به دستوراتي كه ياد گرفته ايد مي خواهيم با دادن آي پي LoopBackبه برنامه
نام كامپيوتر را بدست آوريم.
using System.Net;
namespace test2
{
class Program
{
static void Main(string[] args)
{
IPHostEntry iphost = Dns.GetHostEntry("127.0.0.1");
string hostname = iphost.HostName;
Console.WriteLine(hostname);
}
}
}
خروجي اين دستور بستگي به اين دارد كه نام كامپيوتر شما چه باشد در اينجا خروجي برابر
Mediaنام كامپيوتري كه برنامه را در آن اجرا كرده ام. همچنين براي پي بردن به صحت موضوع
كافيه كه در Runعبارت CMDرا تايپ كرده ودر پنجره باز شده عبارت Hostnameرا تايپ
كرده و كليد Enterرا فشار دهيد تا نام كامپيوتر را مشاهده كنيد. البته مي توانيد با ساخت يك
Local Area Connectionيا همان كانكشن مجازي به سيستم خود يك IPمثلا
192.168.0.1اختصاص داده و با استفاده از اين IPبرنامه خود را تست كنيد.{
} نحوه ي ساختن يك كانكشن مجازي
كليك كنيد در صفحه ي بازNext بر رويStartControl PanelAddHardware
شده روي گزينه اول كليك كنيد سپس بر روي Nextدر صفحه ي بعدي در ليست مربوطه
گزينه آخر را را انتخاب بر روي Nextكليك كنيد سپس در صفحه جديد گزينه دوم را انتخاب
كرده بر روي Nextكليك كرده حال در ليست موجود Network Adaptersرا انتخاب بر
روي Nextكليك كرده در اين صفحه بر روي MicroSoftLoopBack Adapterرا انتخاب
كرده وسپس 2بار بر روي Nextكليك كنيد تا عمليات به پايان برسد همان طور كه
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
مشاهده مي كنيد در Notificationsيك آيكن اضافه شده بر روي آن دابل كليك كرده در
صفحه ي باز شده بر روي Propertiesكليك كرده در صفحه باز شده در ليست
Internet Protocol(TCP/IP) گزينهThis Connection Use the following item
را انتخاب كرده و بر روي Propertiesكليك كرده در صفحه باز شده بر روي
مقدارIPAddress كليك كرده در قسمتUse the following IP Address
255.255.255.0 مقدارSubnetMask را وارد كرده ودر قسمت192.168.0.1
را وارد كرده بر روي Okكليك كرده سپس در پنجره ي اولي گزينه
Ok را انتخاب وسپس بر رويShow Icon in Notification area when Connected
كليك كرده و مابقي پنجر ها را ببنديد. به اين ترتيب شما مي توانيد به جاي آدرس 127.0.0.1
IPجديد خود را وارد كنيد.
:  س+ ا
ن# 2ه 1ل/و ن
ار  -%ت  /6ء  #4ا  . {
اين قسمت از كد برنامه قبل را به اين صورت تغيير دهيد.
IPHostEntry iphost = Dns.GetHostEntry("192.168.0.1");
}حال مي خواهيم با وارد كردن نام كامپيوتر تمامي IPهاي فعال سيستم نمايش داده شود.
using System;
using System.Text;
using System.Net;
namespace test3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter a Computer Name:");
IPHostEntry iphost;
string s;
try
{
s = Console.ReadLine();
iphost = Dns.GetHostEntry(s);
IPAddress[] addresses = iphost.AddressList;
StringBuilder addressList = new StringBuilder();
foreach (IPAddress address in addresses)
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
{
addressList.AppendFormat("IP Address: {0};",
address.ToString());
}
Console.WriteLine(addressList);
}
catch (Exception)
{
Console.WriteLine("Host Not Found...");
}
}
}
}
با اجراي اين كد در صورتي نام كامپيوتر به صورت صحيح وارد شود تمامي IPهاي سيستم
توسط يك حلقه از سيستم استخراج مي شود چون IPيك شي محسوب مي شود با استفاده از
حلقه Foreachاين كار را انجام مي دهيم حال اگر نام كامپيوتر اشتباه وارد شود عبارت
... Host Not Foundنمايش داده مي شود.{
ساختن سوكت)(Socket
فضاي نام System.net.Socketبراي شما رابط سطح پايين Winsock APIsرا فراهم مي
كند .اين بخش در # Cبه صورت كلاس Socketخلاصه شده است.
كلاس Socketدر فضاي نام System.net.Socketقرار دارد، # Cمديريت كدهاي
) Winsock APIsكساني با Cبرنامه نوشته اند !( را فراهم مي كند.
سازنده كلاس Socketبه شرح زير است.
Socket(AddressFamily af, SocketType st,ProtocolType pt)
فرمت پايه اي Socketمشابه تابع )( Socketدر Unixمي باشد
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
پارامتر هايي كه نوع ساختن يك سوكت را مشخص مي كند به شرح زير است.
: AddressFamilyنوع شبكه را معيين مي كند.
:SocketTypeنوع ارتباط را دادها معيين مي كند.
:ProtocolTypeنوع يك پروتكل شبكه را مشخص مي كند.
براي IPنرمال بايد از مقدار AddressFamily.InterWorkاستفاده كنيد منظور از IPنرمال
. بيتي( مي باشد32 ) IP version 4
پارامتر هاي SocketTypeدر جدول زير توضيح داده شده است.
SOCKETTYPE PROTOCOLTYPE DESCRIPTION
بيانگر يك ارتباط بدون اتصال Dgram Udp
بيانگر يك ارتباط اتصال گرا Stream Tcp
پروتكل كنترل پيغام در اينترنت Raw Icmp
Raw Raw Plain IP packet communication
مثال :
Socket newsock = Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
نكته:هر SocketTypeبايد با ProtocolTypeمتناظر خود به كار گر فته شود.
در جدول زير چندين مشخصه Socketكه يك سوكت را مي سازد نشان داده شده است.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
خصوصيات Socket
PROPERTY DESCRIPTION
دريافت AddressFamilyسوكت)كه داراي انواع مختلفي مي
باشد كه در اينجا ما فقط از InterNetworkاستفاده مي
كنيم(
AddressFamily
دريافت مقداري از داده هاي آماده خواندن Available
تنظيم ويا دريافت حالت Blockingدر سوكت Blocking
مقداري را كه نشان دهنده ارتباط سوكت با دستگاه راه دور مي
باشد را دريافت مي كند.
Connected
Handleيك سيستم را براي سوكت دريافت مي كند Handle
يك شي محلي EndPointبراي سوكت دريافت مي كند LocalEndPoint
نوع پروتكل يك سوكت را دريافت مي كند. ProtocolType
اطلاعات EndPointراه دور را براي سوكت دريافت
مي كند.
RemoteEndPoint
نوع سوكت را دريافت مي كند. SocketType
همه ي خصوصيات سوكت به غير از LocalEndPointو RemoteEndPointپس از ساخت سوكت
در دسترس هستند. LocalEndPointو RemoteEndPointخصوصياتي هستند كه به واسطه مقيد
سازي سوكت استفاده مي شوند.
مثال زير خصوصيات Socketرا نشان مي دهد
using System.Net;
using System.Net.Sockets;
namespace SockProp
{
class Program
{
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
static void Main(string[] args)
{
IPAddress ia = IPAddress.Parse("127.0.0.1");
IPEndPoint ie = new IPEndPoint(ia, 8000);
Socket test = new
Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
Console.WriteLine("Socket type: {0}", test.SocketType);
Console.WriteLine("ProtocolType: {0}", test.ProtocolType);
test.Blocking=false;
Console.WriteLine("Blocking:{0}", test.Blocking);
Console.WriteLine("Connected:{0}", test.Connected);
test.Bind(ie);
IPEndPoint iep = (IPEndPoint)test.LocalEndPoint;
Console.WriteLine("LocalEndPoint:{0}", iep.ToString());
test.Close();
}
}
}
خروجي به صورت زير مي باشد
Socket type: Stream
ProtocolType: Tcp
Blocking:False
Connected:False
LocalEndPoint:127.0.0.1:8000
Press any key to continue.......
متد )( Bindبراي مقيد كردن سوكت به آدرس LoopBackسيستم مي باشد.
با استفاده از متد هاي داخلي سوكت شما مي توانيد يك ارتباط اتصال گرا به آدرس محلي يك
شبكه يا يك سيستم راه دور بسازيد.
همانطور كه گفتيم متد )( Bindبراي مقيدكردن سوكت به يك آدرس استفاده مي شود اين متد
به صورت روبه رو استفاده مي شود )Bind(EndPoint address
پارامتر Addressنكته اي مهم در ، IPEndPointكه شامل يك IPآدرس وشماره پورت
مي باشد پس از اينكه سوكت به يك آدرس محلي مقيد شد. شما با استفاده از متد )(Listen
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
به خط گوش دهيد تا يك Clientسعي به برقراري ارتباط نموده.
شكل كلي اين متد به صورت )Listen(int backlog
Backlogاين پارامتر تعداد ارتباطاتي را كه در صف يك سيستم براي انتظار يك سرويس
هستند را تعيين مي كند.
بعد از )( listenسرور آماده دريافت يك تقاضاي ارتباط از Clientمي باشد.اين كار توسط متد
)( Acceptانجام مي شود.
متد )( Acceptمتدي است كه حاوي اطالاعاتي درباره يك سوكت جديده واينكه همه ي
Connectionها براي ارتباط با آن بايد آنرا فراخواني كنند.
به اين مثال توجه كنيد.
IPHostEntry local = Dns.GetHostByName(Dns.GetHostName());
IPEndPoint iep = new IPEndPoint(local.AddressList[0],
8000);
Socket newserver = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
newserver.Bind(iep);
newserver.Listen(5);
Socket newclient = newserver.Accept ();
زماني Clientبه سرور متصل مي شود شي newserverحاوي يك ارتباط جديد كه بايد ازاين
به بعد در همه ي ارتباطات بعدي با Clientاستفاده شود.
بعد از اينكه Clientتقاضا ي يك ارتباط را داد . Clientو Serverمي توانند شروع به انتقال
اطلاعات نمايند . متد هاي )(Reciveو )( Sendبراي ارسال و دريافت اطلاعات استفاده مي شوند.
هر دو متد داراي چهار OverLoadمي باشد كه به شرح زير مي باشد.
نكته: به توابعي كه داراي نام هاي مشتركي هستند ولي داراي پارامتر هاي متفاوتي با همديگر
مي باشند به اين توابع ، توابع Overloaded functionمي گويند.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
METHOD DESCRIPTION
داده ها را دريافت كرده ودر يك آرايه از نوع بايت ذخيره
مي كند.
Receive(byte[] data)
خصوصيات يك سوكت و داده هاي دريافتي را در يك آرايه
ذخيره مي كند.
Receive(byte[] data, SocketFlags sf)
خصوصيات يك سوكت ، انداز ي داده هاي دريافتي را در يك
آرايه از نوع بايت ذخير ه مي كند.
Receive(byte[] data, int size, SocketFlags sf)
خصوصيات يك سوكت ، انداز ي داده هاي دريافتي واينكه
داده ها بر حسب Offsetمرتب شده و در آرايه ذخير ه
مي كند.
Receive(byte[] data, int offset, int size,
SocketFlags sf)
داده هاي موجود در آرايه را ارسال مي كند. )Send(byte[] data
خصوصيات سوكت را تنظيم و داده هاي موجود در آرايه را
ارسال مي كند.
Send(byte[] data, SocketFlags sf)
خصوصيات و سايز داده اي ارسالي )بر حسب بايت( را تنظيم
وداده هاي موجود در آرايه را ارسال مي كند
Send(byte[] data, int size, SocketFlags sf)
خصوصيات و سايز داده اي ارسالي )بر حسب بايت( را تنظيم
وداده هاي رشته اي موجود در آرايه را ارسال مي كند.
Send(byte[] data, int offset, int size, SocketFlags
sf)
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
مقاديري كه به SocketFlagsنسبت داده مي شود به شرح جدول زير مي باشد.
VALUE DESCRIPTION
ارسال و دريافت داده بدون استفاده از جدول مسير يابي DontRoute
يك مقدار عددي براي استفاده از ساختار
WSABUFبراي ارسال ودريافت داده ها
MaxIOVectorLength
از Flagاستفاده نمي كند None
OutOfBand Processes out-of-band data
قسمتي از پيغام را دريافت و يا ارسال مي كند Partial
فقط به پيغام هاي وارد شده توجه مي كند. Peek
..........................................................................................................................................
نكته: همچنين شما مي توانيد به جا ي استفاده از متد )( Bindاز متد )( Connectاستفاده
كنيد.
مثال
IPAddress host = IPAddress.Parse("192.168.1.1");
IPEndPoint hostep = new IPEndPoint(host, 8000);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sock.Connect(hostep);
..........................................................................................................................................
زماني كه يك ارتباط بر قرار شد ، Clientمي تواند با استفاده از متد هاي )( Sendو
)( Receiveبه ارسال ودريافت اطلا عات به پردازد. اما زماني كه ارتباط به پايان رسيد Socket
شما بايد Closeشود. براي اين كار دو متد مي توانيد استفاده كنيد كه يكي از آن دو ، متد
)( Shutdownكه اين متد جلسه شما را متوقف مي كند و متد Closeكه به جلسه شما پايان
مي دهد.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
متد )( Shutdownداراي پارامتر هايي مي باشد كه نحوه ي Shutdownشدن Socketرا
مشخص مي كند. در جدول زير اين پارامتر ها توضيح داده شده است.
VALUE DESCRIPTION
از ارسال ودر يافت داده ها جوگيري مي كند SocketShutdown.Both
از دريافت داده ها جلوگيري مي كند SocketShutdown.Receive
از ارسال داده ها جلو گيري مي كند SocketShutdown.Send
مثال
sock.Shutdown(SocketShutdown.Both);
sock.Close();
يك مثال كاربردي از ارسال و دريافت داده ها بين Clientو Serverبا استفاده از روش
اتصال )گرا يك برنامه چت ساده(
مراحل ساخت برنامه سمت سرور
 ساخت يك سوكت
 مقيد كردن سوكت به يك IPEndPointمحلي
 قرار دادن سوكت در حالت شنود
 دريافت تقاضا براي ارتباط با سوكت
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Server
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[2048];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,
9050);
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
Socket newsock = new
Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Console.WriteLine("Waiting for a client...");
سوكت ساخته شده//
و منتظر دريافت يك تقاضا از سمت كلاينت مي باشد//
Socket client = newsock.Accept();
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port
{1}", clientep.Address, clientep.Port);
//
string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);
client.Send(data, data.Length, SocketFlags.None);
سرور پس از دريافت يك تقاضا از كلاينت يك پيغام خوشامد به كلاينت مي فرستد //
while (true)
{
سرور پيغام كلاينت را در يافت كرده اگر طول آن كمتر از صفر نبود آنرا چاپ مي كند //
data = new byte[1024];
recv = client.Receive(data);
if (recv == 0)
break;
Console.WriteLine(Encoding.ASCII.GetString(data, 0,
recv));
در اين قسمت سرور پس ازدريافت پيغام همان پيغام ارسال شده ي كلاينت را برايش بر ميگرداند بدين صورت كلاينت //
مطمئن مي شود كه داده هايش رسيده است
client.Send(data, recv, SocketFlags.None);
}
Console.WriteLine("Disconnected from
{0}",clientep.Address);
client.Close();
newsock.Close();
}
}
}
توضيح كلي برنامه
در ابتدا يك آرايه از نوع بايت تعريف شده كه پيغام ها ي ورودي و خروجي درآن ذخيره مي گردد
چيزي كه مهم است ، اينست كه متد هاي Sendو Receiveبا داده هايي از نوع بايت سر و
كاردارند
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
وداده ها بايد به نحوي به صورت بايت به بايت ارسال و دريا فت شوند همه ي داده هاي منتقل
شده به سوكت بايد به طريقي به نوع بايت تبديل شوند متد Encoding.ASCIIبا استفاده از
System.text ، NameSpaseقابل دسترس مي باشد اين متد داده ها را به آرايه اي از
بايت ها تبديل مي كند و مي تواند اين كار را بر عكس نيز انجام دهد .
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
با استفاده از فيلد IPAddress.Anyسرور يك تقاضا را روي سيستم شما پيكره بندي مي كند
اگر شما مي خواهيد كه از يك رابط خاص بسته ها را دريافت كنيد مي توانيد از IPآن رابط
استفاده كنيد به اين صورت
IPEndPoint ipep =
newIPEndPoint(IPAddress.Parse("192.168.1.6"), 9050);
بعد از معين كردن نحوي استفاده از IPEndPointشما بايد يك سوكت بسازيد سپس با استفاده
از متد هاي Bindو Listenبراي مقيدكردن يك سوكت به يك IPEndPointاز آن استفاده
كنيد. سرانجام از متد)( Acceptبراي جستجوي درخواست هاي Clientاستفاده كنيد .متد
)( Acceptيك شي از نوع سوكت بر مي گرداند .اين همان چيزي است كه بايد در ارتباط با يك
Clientاستفاده شود بعد از اينكه متد )( Acceptتقاضاي يك Clientرا پذيرفت، يك سوكت
كه داراي خاصيتي به نام RemotEndPointمي باشد بر مي گرداند اين سوكت حاوي IPآدرس
Clientمي باشد . RemotEndPointشي از نوع EndPointمي باشد كه شما بايد با استفاده
از تبديل مبنا آنرا به IPEndPointتبديل كنيد.
IPEndPoint clientep =(IPEndPoint)client.RemoteEndPoint;
بعد از اينكه سوكت شما به Clientبرقرار شد شما مي توانيد با استفاده از يك قانون كلي به نقل
وانتقال داده ها به پردازيد .
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
اين دستور ;) recv = client.Receive(dataبا عث مي شود كه متد
Receiveطول كاراكتر هاي در يافتي را داخل متغيير recvقرار دهد.
اين مقدار همان اندازه داده هاي دريافتي مي باشد.
اما مراحل ساخت برنامه سمت Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[2048];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new
Socket(AddressFamily.InterNetwork,SocketType.Stream,
ProtocolType.Tcp);
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
كلاينت پيام خوش آمد گويي سرور را چاپ مي كند//
int recv = server.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
while (true)
{
كلاينت متني را از صفحه كليد خوانده و آنرا به سرور ارسال مي كند //
input = Console.ReadLine();
if (input == "exit")
break;
server.Send(Encoding.ASCII.GetBytes(input));
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
پس از ارسال متن به سرور ، سرور دوباره همان پيام را به كلاينت ارسال مي كنداين كار //
باعث مي شود كلاينت از ارسال پيام خود به سرور مطمئن شود در صورتي كه كلاينت عبارت خروج را تايپ كند برنامه خاتمه
مي يابد
data = new byte[1024];
recv = server.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
}
}
(Connectionless Sockets) برنامه هاي بدون اتصال
برنامه نويس دو تا كار بايد براي برنامه سمت سرور كه ارسال ودريافت داده را انجام مي دهد بكار
گيرد.
- 1ساخت يك شي از نوع سوكت Socket
- 2مقيدكردن سوكت به يك IPEndPoint
بعد از اين دو كار ، سوكت مي تواند به ارسال ودريافت داده بپردازد اما شما براي ارسال و دريافت
داده ها نمي توانيد از از متد هاي )( Receiveو )( Sendاستفاده كنيد بلكه بايد از دو متد جديد
. استفاده كنيدSendTo() وReceivefrom()
متد )( SendToداده ها ر ا به شكل آريه اي از بايت ها به يك EndPointتوسط يك متغيير
Remoteارسال مي كند.
شكل كلي متد به صورت زير است
SendTo(byte[] data,int Offset,int Size,SocketFlags
Flags,EndPoint Remote)
اما متد)( : Receivefromاين متد براي دريافت داده ها ارسال شده استفاده مي شود غالب كلي
اين متد به صورت زير مي باشد.
Receive From(byte[] data, ref Endpoint Remote)
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
برنامه زير يك برنامه سمت سرور كه با استفاده از پروتكل UDPپياده سازي شده است
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleUdpSrvr
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}:",
Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while (true)
{
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(data, recv, SocketFlags.None, Remote);
}
}
}
}
تمام مراحل برنامه مثل برنامه Clientو Serverاي كه با پروتكل Tcpنوشته ايم .
.SocketType.Dgram, ProtocolType.Udp به غير از تغيير
نكته: زماني شما از يك پورت براي ارتباط استفاده مي كنيد بايد دقت داشته باشيد اين پورت
توسط برنامه ديگري استفاده نشده باشد براي فهميدن اين موضوع شما مي توانيد با استفاده از
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
دستور ، Netstat –aوضعيت پورتها ي سيستم را مشاهده كنيد اين دستور را بايد در
CommandPromptوارد كرده اگر اين دستور را قبل از اجراي برنامه وارد كنيد ليستي از
پورتهاي مورد استفاده و پورتهايي كه در وضعيت شنود قرار دارند را مشاهده مي كنيد در صورتي
كه پورت مورد استفاده در برنامه شما ) (9050در اين ليست وجود نداشت بدين معنا مي باشد كه
اين پورت آزاد مي باشد و شما مي توانيد از آن استفاده كنيد حال اگر برنامه را اجراكنيد و بعد از
دستور Netstat –aاستفاده كنيد مشاهد ه مي كنيد كه پورت مورد استفاده در برنامه شما
به صورت زير ظا هر مي شود.
*:* : 9050نام كامپيوتر شما Ud p
برنامه سمت Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleUdpClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"),
9050);
Socket server = new
Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
int recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}:",
Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while (true)
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
data = new byte[1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stopping client");
server.Close();
}
}
}
براي اجرا ابتدا برنامه Serverوسپس برنامه Clientرا اجرا كنيد.
نكته : زماني كه شما در برنامه Clientسايز بافر داده هاي ارسالي خود را كم در نظر بگيريد
برنامه شما نمي تواند داده هايي بيش از ظرفيت با فر را ارسال كند وبرنامه شما با خطا متوقف
مي شود. برنامه زير در ك موضوع را براي شما ساده مي كند.
شما اين برنامه Clientجديد را با برنامه UDP Serverقبلي تست كنيد
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class BadUdpClient
{
public static void Main()
{
byte[] data = new byte[30];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)sender;
data = new byte[30];
int recv = server.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine("Message received from {0}:",
tmpRemote.ToString());
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote);
data = new byte[30];
recv = server.ReceiveFrom(data, ref tmpRemote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stopping client");
server.Close();
}
}
در اين برنامه زماني كه شما در برنامه خود 35كاراكتر به بالا وارد كنيد برنامه شما با خطا مواجه
مي شود و داده هاي شما گم مي شود اگرچه شما نمي توانيد داده هايي كه بيشتر از سايز بافر
ارسال و گم شده اند را بازيابي كنيد اما مي توانيد آنها را مديريت كنيد به اين صورت كه اگر داده
هاي ارسالي شما داراي سايز ي بيشتر از سايز بافر بود شما نيز مي توانيد سايز بافر را افزايش داده
اين افزايش براي بار دوم صورت مي پذيرد. براي مثال اگر دفعه ي اول 35كاركتر فرستاديد داده
هاي شما گم مي شود حال اگر دفعه ي دوم نيز همان 35كاراكتر را فرستاديد دادهاي شما ارسال
مي شود در واقع سايز بافر شما متناسب با ورودي افزايش پيدا مي كند البته شما مي توانيد همان
دفعه ي اول سايز بافر خود را افزايش دهيد. به برنامه زير توجه كنيد.
شما اين برنامه Clientجديد را با برنامه UDP Serverقبلي تست كنيد.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class BetterdUdpClient
{
public static void Main()
{
byte[] data = new byte[30];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)sender;
data = new byte[30];
int recv = server.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine("Message received from {0}:",
tmpRemote.ToString());
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
int i = 30;
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
int a;
a = input.Length;
server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote);
data = new byte[i];
try
{
recv = server.ReceiveFrom(data, ref tmpRemote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
catch (SocketException)
{
Console.WriteLine("WARNING: data lost, retry message.");
int v;
v = a - i;
i +=v ;
}
}
Console.WriteLine("Stopping client");
server.Close();
}
}
اين برنامه به اين صورت مي باشد كه اگر سايز بافر شما 30وسايز داده هاي شما 47باشد تفاضل
بين 30و 47را بدست مي آورد - 47 30وسپس مقدار بدست آمده ر ا با بافر داده كه 30
مي باشد جمع كرد ه بين صورت در بار دوم شما مي توانيد داده هايي را با سايز 47يا همان 47
كاراكتر را ارسال كنيد .
جلو گيري از گم شدن بسته هاي ارسالي
بعضا رديابي بسته هاي گم شده در يك ارتباط UDPمشكل مي باشد زيرا UDPيك پروتكل
بدون ارتباط مي باشد و راهي براي اينكه بفهميم بسته ما به درستي ارسال شده وجود ندارد.
به عنوان مثال بسياري از بازي هاي رايانه اي براي ارسال اطلاعات به پروتكل UDPوابسته هستند
)بازي هاي تحت شبكه ( در مدت زماني كوتاهي بازي كنندگان موقعيت و وضعيت خود را براي
ساير بازي كنندگان ارسال مي كنند اگر يك بسته در شبكه گم شود آن بسته دوباره در مدت
كوتاهي ارسال مي شود .
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
براي ارسال مجدد در برنامه هاي UDPدو روش وجود دارد.
-١ Asynchronous sockets and a Timer object
كه اين موضوع مورد بحث نمي باشد
وديگري
-٢ Synchronous sockets and setting a socket time-out value
زماني كه برنامه شما از متد )( ReceiveFromاستفاده مي كند هيچ تضميني براي دربافت داده
ها وجود ندارد شما مي توانيد يك زمان وقفه براي دريافت داده ها تعيين كنيد كه اين كار را
مي توانيد با استفاده از متد SetSocketOptionانجام دهيد .
غالب اين متد به شكل زير مي باشد
SetSocketOption(SocketOptionLevel so,SocketOptionName sn,int
value)
كه هر كدام از خصوصيات آن در جدول زير توضيح داده شده است
SocketOptionLevel پارمتر هاي
VALUE DESCRIPTION
تنظيمات IPبراي سوكت ها IP
تنظيمات براي سوكت Socket
تنظمات براي سوكت Tcp TCP
تنظمات براي سوكت UDP
Udp
SocketOptionName پارمتر هاي
VALUE SOCKETOPTIONLEVEL DESCRIPTION
اگر Trueباشد سوكت در حال گوش
دادن است.
AcceptConnection Socket
به گروهاي كاري، يك ipاضافه مي
.كند
AddMembership IP
AddSourceMembership IP اتصال به منابع يك گروه
داده هاي يك منبع را Blockمي
.كند
BlockSource IP
اگر Trueباشد به ارسال پيغام هاي Broadcast Socket
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
Broad Castاجازه عبور مي دهد.
از داده هاي ضروري استفاده مي كند
فقط يك مرتبه مي توان آن را ست
كرد وديگر نمي توانيد آنرا تغيير دهيد.
BsdUrgent IP
مي توانيد مقدار Checksumرا
براي آن تنظيم يا از آن دريافت كنيد.
ChecksumCoverage Udp
اگر Trueباشد اطلا عات ركورد را
Debugمي كند.
Debug Socket
فيلد Fragmentرا در بسته هاي IP
استفاده نمي كند.
DontFragment IP
سوكت را بدون انتظار براي دريافت
داده ها مي بندد.
DontLinger Socket
بسته ها را به طور مستقيم به آدرس
رابط ارسال مي كند.
DontRoute Udp
يك IPرا از گروه كاري Drops
)حذف( مي كند.
DropMembership IP
يك منبع را از گروه كاري Dropsمي
.كند
DropSourceMembership IP
Errorهاي يك وضعيت را مشخص
مي كند.
Error Socket
يك سوكت را براي دسترسي انحصاري
فعال مي كند.
ExclusiveAddressUse Socket
براي تسريع داده ها استفاده مي شود
فقط يك مرتبه مي توان آن را ست
كرد وديگر نمي توانيد آنرا تغيير دهيد.
Expedited IP
داده هاي ارسال شده به يك سوكت را
زماني كه IPشامل هدر باشد نشان
مي دهد.
HeaderIncluded IP
تنضيمات يك IPخاص، براي بسته
هاي دورازدسترس
IPOptions IP
زمان زنده ماندن يك بسته IPرا
تنظيم
IpTimeToLive IP
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
(Time-to -live)مي كند
TCpزمان زنده ماندن بسته رانگه مي
دارد.
KeepAlive Socket
بعد از بستن سوكت منتظر داده هاي
اضا في مي باشد.
Linger Socket
حداكثر طول صف استفاده شده را
تنظيم مي كند.
MaxConnections Socket
رابط را براي استفاده بسته هاي
MultiCastتنظيم مي .كند
MulticastInterface IP
MulticastLoopback IP LoopBack مالتي كستIP
زمان زنده بودن ipمالتي كست
راتنظيم مي كند .
MulticastTimeToLive IP
بسته هاي UDPرا با Checksum
صفر ارسال مي كند.
NoChecksum Udp
الگوريتم Nagleرا براي بسته هاي
Tcpغير فعال مي .كند
NoDelay Tcp
اجازه مي دهد داده ها خارج از باند
دريافت شود.
OutOfBandInline Socket
اطلاعاتي درباره دريافت بسته بر مي
گرداند.
PacketInformation IP
مجموع بافر را براي بسته هاي دريافت
شده تنظيم مي كند.
ReceiveBuffer Socket
ReceiveLowWater Socket Receives low water mark
زمان وقفه را دريافت مي كند ReceiveTimeout Socket
به سوكت اجازه مي دهد كه پيش از
استفاده به يك پورت مقيد شود.
ReuseAddress Socket
مجموع بافر هاي رزرو شده ، براي
ارسال بسته ها را تنظيم مي كند.
SendBuffer Socket
SendLowWater Socket Sends low water mark
مقدار زمان، به پايان رسيده را ارسال
مي .كند
SendTimeout Socket
نوع سوكت را دريافت مي كند. Type Socket
نوع فيلد سرويس را براي ipتنظيم TypeOfService IP
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
مي كند.
سوكت را در حالت Non-Blocking
تنظيم مي كند.
UnblockSource IP
زماني كه گذرگاه فرعي شبكه قابل
استفاده باشد ..
UseLoopback Socket
و پارامتر Valueمقداري را براي نام سوكت تنظيم مي كند.
براي تعيين اين زمان)وقفه( شما بايد SetSocketOptionرا به صورت زير تعريف كنيد.
server.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 3000)
متد SetSocketOptionاز كلاس Socketمنشا مي شو د بنابراين شما بايد شي ازنوع Socketرا
مورد استفاده قرار دهيد كه در اينجا اين شي Serverمي باشد
عددي كه بر حسب Integerبيان شده ) (3000زمان بر حسب ميلي ثانيه مي باشد تا دادها قبل
از اين زمان به سوكت برسد .
برنامه زير نحوه استفاده از متد SetSocketOptionرا نن  ده
.
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace TimeoutUdpClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData;
int recv;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new
Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
int sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,SocketOpt
ionName.ReceiveTimeout);
Console.WriteLine("Default timeout: {0}", sockopt);
server.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 3000);
sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,SocketOpt
ionName.ReceiveTimeout);
Console.WriteLine("New timeout: {0}", sockopt);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)sender;
data = new byte[1024];
recv = server.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine("Message received from
{0}:",tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote);
data = new byte[1024];
recv = server.ReceiveFrom(data, ref tmpRemote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stopping client");
server.Close();
}
}
}
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
برنامه در ابتدا مقدار زمان پيش فرض را دريافت كرده وسپس نمايش مي دهد.
int sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout);
Console.WriteLine("Default timeout: {0}", sockopt);
متد GetSocketOptionشي از نوع Objectبر مي گرداند )همان مقدار پيش فرض(
براي اينكه اين شي را به يك عدد صحيح تبديل كنيم از عبارت intاستفاده كرده ايم.
اين برنامه در مدت زمان تعيين شده داده ها را ارسال ودريافت مي كند.شما اين برنامه Client
جديد را با برنامه UDP Serverقبلي تست كنيد.بعد از اينكه دو برنامه با هم ارتباط بر قرار
كردند شما برنامه سمت سرور با كليد Ctrl+Cببنديد حال متني را در برنامه UDP Client
نوشته وارسال كنيد مي بينيد كه برنامه شما با خطا متوقف مي شود چون نمي تواند با سرور ارتباط
برقرار كند شما مي توانيد اين وضعيت را كنترل كنيد فقط كافي كه كد عبارت برگشتي از سرور را
در يك Tryو پيغام خطاي آنرا در يك Catchبنويسيم براي حالات ديگر نيز مي توانيم اين
كار را انجام دهيم مثلا زماني كه Clientپيغام خوشامد گويي سرور را نتواند به هر دليلي دريافت
كند به برنامه زير توجه كنيد.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace ExceptionUdpClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData;
int recv;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new
Socket(AddressFamily.InterNetwork,SocketType.Dgram,
ProtocolType.Udp);
int sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout);
Console.WriteLine("Default timeout: {0}", sockopt);
server.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 3000);
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout);
Console.WriteLine("New timeout: {0}", sockopt);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
try
{
recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}:",
Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
}
catch (SocketException)
{
Console.WriteLine("Problem communicating with remote
server");
return;
}
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), ipep);
data = new byte[1024];
try
{
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
catch (SocketException)
{
Console.WriteLine("Error receiving message");
}
}
Console.WriteLine("Stopping client");
server.Close();
}
}
}
اين برنامه فرقي با برنامه قبلي ندارد بلكه فقط در آن خطاها مديريت شده اند اگر برنامه شما
نتواند در مدت زماني كه تعيين شده داده ها را دريافت كند پيغام خطاي آن نمايش داده مي شود.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
تكرار در ارسال داده ها يي كه موفق به ارسال نشده اند
دلايل زيادي وجود دارد كه بسته UDPشما به مقصد نرسد كه شما بايد با سعي در ارسال مجدد
بسته )يا پيغام ها ( بسته را ارسال كنيد راه ساده اي كه براي انتقال داده وجود دارد اين است كه
يك متد جداكننده براي ارسال ودر يافت پيغام ها بسازيد.
مراحل ساخت اين متد به صورت زير مي باشد.
- 1ارسال يك پيغام به Hostرا ه دور
- 2مدت زمان انتظار براي دريافت بسته از راه دور
- 3اگر پاسخ را دريافت كرديد سايز بسته را دريافت كرده واز متد خارج مي شويد.
- 4اگر پاسخي در مدت زمان معين دريافت نكرديد مقدار retryرا افزايش دهيد.
- 5متد retryرا چك كنيد اگر مقدار كمتر حد مشخص شده بود دوباره به مرحله 1باز مي
گرديم اگر مساوي بود پيغام مناسبي در Clientنمايش داده مي شود.
)بخش آخر ( )5مهم ترين قسمت برنامه مي باشد (
متد زير داده ها را ارسال ودريافت مي كند و شما مي توانيد در هر قسمت از برنامه كه به ارسال و
دريافت داده نياز داريد از آن استفاده كنيد.
private int SndRcvData(Socket s, byte[] message, EndPoint
rmtdevice)
{
int recv;
int retry = 0;
while (true)
{
Console.WriteLine("Attempt #{0}", retry);
try
{
s.SendTo(message, message.Length,
SocketFlags.None, rmtdevice);
data = new byte[1024];
recv = s.ReceiveFrom(data, ref Remote);
}
catch (SocketException)
{
recv = 0;
}
if (recv > 0)
{
return recv;
}
else
{
retry++;
if (retry > 4)
{
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
return 0;
}
}
}
}
اين متد داراي سه ورودي مي باشد .
- 1يك سوكت كه پيش از متد ساخته مي شود.
- 2پيغام كه براي ارسال به راه دور
- 3يك شي EndPointكه حاوي IPو Portرا دور  
.
 ن ; ت%.
 6
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class RetryUdpClient
{
private byte[] data = new byte[1024];
private static IPEndPoint sender = new
IPEndPoint(IPAddress.Any, 0);
private static EndPoint Remote = (EndPoint)sender;
private int SndRcvData(Socket s, byte[] message, EndPoint
rmtdevice)
{
int recv;
int retry = 0;
while (true)
{
Console.WriteLine("Attempt #{0}", retry);
try
{
s.SendTo(message, message.Length, SocketFlags.None,
rmtdevice);
data = new byte[1024];
recv = s.ReceiveFrom(data, ref Remote);
}
catch (SocketException)
{
recv = 0;
}
if (recv > 0)
{
return recv;
}
else
{
retry++;
if (retry > 4)
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
{
return 0;
}
}
}
}
public RetryUdpClient()
{
string input, stringData;
int recv;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
int sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout);
Console.WriteLine("Default timeout: {0}", sockopt);
server.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 3000);
sockopt =
(int)server.GetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout);
Console.WriteLine("New timeout: {0}", sockopt);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
recv = SndRcvData(server, data, ipep);
if (recv > 0)
{
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
else
{
Console.WriteLine("Unable to communicate with remote host");
return;
}
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
recv = SndRcvData(server, Encoding.ASCII.GetBytes(input),
ipep);
if (recv > 0)
{
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
else
Console.WriteLine("Did not receive an answer");
}
Console.WriteLine("Stopping client");
server.Close();
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
}
public static void Main()
{
RetryUdpClient ruc = new RetryUdpClient();
}
}
پس از اجراي برنامه RetryUdpClientبا برنامه UDP Serverقبلي برنامه Clientبا استفاده از
متد RetryUdpClientمبادرت به برقراري ارتباط مي نمايد در صورتي كه مقدار بازگشتي از
برنامه Serverكه در متغيير Recvبيشتر از صفر باشد برنامه داده ها ر ا ارسال مي كند اما در
صورتيكه داده ها را ارسال كرد اما در مدت زمان مشخص شده ) (3000ميلي ثانيه جوابي از سرور
دريافت نكرد )مثلا برنامه سرور بسته شود( در داخل متد SndRcvDataيك استثنا رخ مي دهد.
catch (SocketException)
{
recv = 0;
}
در اين صورت با صفر كردن متغيير Recvبه برنامه مي فهمانيم كه اشكا لي پيش آمده وشر ط
مذكور درست نمي با شد.
if (recv > 0)
{
return recv;
}
پس Elseبرنامه اجرا شده كه متغيير Retryرا يك واحد افزايش مي دهد وچون برنامه هنوز از
حلقه خارج نشده دوباره به ابتداي حلقه برگشته و مراحل قبل را تكرار كرده تا همان داده را ارسال
كند در صورتي كه برنامه نتواند داده ها را ارسال كند در مجموع 4بار به ارسال دوباره داده سعي
مي كند اگر موفق به ارسال نشود پيغام
Did not receive an answer
ظاهر مي شود اگر تا قبل از رسيدن به 4بار برنامه سمت سرور را اجرا كنيد مي بينيد كه داده ها
ارسال مي شود.
براي درك برنامه كافي كه برنامه Clientرا به صورت قدم به قدم با استفاده از كليد F11
. ( كنيدTrace)
يمد ريت Errorهاي چندگانه
شما مي توانيد Errorهاي چند گانه اي كه توليد مي شوند را مديريت كنيد. منظور از Error
هاي چند گانه CodeErrorمي باشد .
شما مي توانيد براي هر Errorكه در Catchرخ مي دهد دليل آنرا به صورت يك پيغام مناسب
با Errorتوليد شده به كاربر نمايش دهيد.
در زير ليستي از Errorهاي كه ممكن است به وجود آيند را توضيح داده ايم.
www.ParsBook.org
www.Mihandownload.com www.Mihandownload.com
ERROR CODE DESCRIPTI


About the author

160