( تعداد نمایش : 1880 )

کنترل WinSock

مقدمه :
کنترل WinSock نسبت به تمام کنترلهای اینترنت در سطح پایینتری قرار دارد . این کنترل امکان ایجاد سرویسهای شبکه ای مبتنی بر پروتکلهای TCP و UDP را مهیا می کند . بعبارت دیگر توسط این کنترل می توان برنامه های کاربردی Client/Server ( سرویس گیرنده / سرویس دهنده ) ایجاد و با استفاده از پروتکل TCP و یا UDP بین آنها ارتباط برقرار نمود .
با تنظیم خصوصیات و فراخوانی متدهای این کنترل می توانید به راحتی به یک کامپیوتر راه دور متصل شوید و داده ها را در هر دو جهت جابجا نمائید . نمونه کاربرهایی که می توان با این کنترل ایجاد نمود :
Client-server chat ، Mail client ، Mail server ، Proxy Server ، Network Game ، Port Scanner ، پیاده سازی الگوریتم های موازی و …
مبانی TCP :
پروتکل کنترل اینترنت ( Transfer Control Protocol ) اجازه می دهد یک اتصال ( Connection ) را از طریق سوکت ( socket ) به یک کامپیوتر راه دور ( Remote Computer ) ساخته و استفاده کنید . با استفاده از این اتصال ، هر دو کامپیوتر می توانند داده ها را بین خودشان انتقال دهند . برقراری ارتباط از طریق TCP همانند صحبت کردن با تلفن است که باید حتماً اتصالی بین دو کامپیوتر صورت گیرد تا بتوانند با هم ارتباط برقرار کنند .
اگر یک برنامه Client می سازید بایستی بدانید که نام یا آدرس IP کامپیوتر Server چیست ( Remote Host IP ) و همچنین از طریق چه پورتی می توانید به آن متصل شوید ( Remote Port ) . حال بایستی به آن پورت Connect کنید .
همچنین اگر یک برنامه Server می سازید بایستی پورتی را که روی آن به درخواستها گوش می دهید مشخص کنید ( LocalPort ) و سپس به پورت گوش دهید ( Listen ) .
زمانیکه یک کامپیوتر Client تقاضای یک اتصال را می دهد Server این درخواست را Accept می کند .
زمانیکه یک اتصال ساخته می شود ، هر دو کامپیوتر می توانند داده را فرستاده و دریافت کنند .
مبانی UDP :
پروتکل دیتاگرام کاربر ( User Datagram Protocol ) پروتکلی بدون اتصال ( Connectionless ) است . برخلاف TCP ، کامپیوترها نیاز به برپا کردن یک اتصال ندارند بنابراین یک برنامه می تواند یک client و یا یک server باشد . برقراری ارتباط در UDP شبیه ارسال نامه از طریق پست است .
برای انتقال داده توسط UDP ابتدا باید Local Port کامپیوتر Client تنظیم گردد . کامپیوتر Server تنها بایستی RemoteHost را برابر آدرس کامپیوتر Client قرار دهد و همچنین Remote Port را همان Local Port کامپیوتر Client قرار دهد . سپس دو کامپیوتر می توانند داده ها را بین خود جابجا کنند .
استفاده از کنترل WinSock :
1 – انتخاب پروتکل: در زمان استفاده از کنترل WinSock اولین کاری که باید انجام دهید انتخاب یکی از پروتکلهای TCP یا UDP است . طبیعت برنامه ای که شما می سازید نوع پروتکلی را که باید استفاده کنید مشخص می کند . چند سوال زیر به شما کمک می کند که پروتکل مورد نیازتان را انتخاب کنید :
- آیا برنامه شما در زمانیکه داده فرستاده می شود یا دریافت می شود نیاز به اطلاعاتی از طرف Server یا Client دارد ؟ اگر چنین است بایستی یک اتصال TCP قبل از ارسال یا دریافت داده ایجاد شود .
- آیا داده بسیار بزرگ است ( مثل تصویر یا فایلهای صوتی ) ؟ زمانیکه یک اتصال TCP ساخته می شود پروتکل TCP اتصال را باقی نگه می دارد و درستی ارسال داده تضمین شده است . این اتصال در هر حال به منابع محاسباتی بیشتری نیاز دارد و بنابراین پرهزینه تر است .
- آیا داده متناوب ارسال می شود یا در یک نشست ( Session ) ارسال خواهد شد ؟ برای مثال اگر شما یک برنامه می سازید که کامپترهای مشخصی را در یک زمان خاص از انجام شدن عملیاتی مطلع می کند پروتکل UDP مناسب تر است . پروتکل UDP همچنین برای ارسال مقادیر کوچک داده ای مناست تر می باشد .
۲ – تنظیم پروتکل : برای تنظیم پروتکلی که می خواهید در برنامه تان از آن استفاده کنید در زمان طراحی برنامه خاصیت Protocol کنترل WinSock را برابر sckTCPProtocol و یا sckUDPProtocol قرار دهید . همچنین می توانید پروتکل خود را توسط کد زیر تنظیم کنید :

WinSock.Protocol=sckTCPProtocol

3 – مشخص کردن نام کامپیوتان : برای اتصال به کامپیوتر راه دور بایستی آدرس IP و یا نام کامپوتر را بدانید .
نام کامپیوتر در Control Panel/Network/Identification موجود است . در صورتیکه می خواهید دو برنامه Client و Server خود را روی یک کامپیوتر تست کنید از آدرس IP 127.0.0.1 برای هر دو استفاده کنید اما اگر دو برنامه را روی دو کامپیوتر مجزا در شبکه قرار داده اید با اجرای دستور ipconfig در DOS Prompt می توانید آدرس IP کامپیوتر ها را بدست آورید .
۴ – ایجاد اتصال TCP : در زمان ساخت برنامه ای که از پروتکل TCP استفاده می کند ابتدا باید تصمیم بگیرید که این برنامه Client است یا Server . برای ساخت یک برنامه Server بایستی روی یک پورت خاص Listen کنید . زمانیکه Client تقاضای یک اتصال را می دهد ، برنامه Server می تواند آنرا Accept کند و بنابراین اتصال کامل شده است . حال Client و Server می توانند با هم ارتباط داشته باشند .
مراحل زیر ساخت یک سرور چت ساده بر مبنای TCP را نشان می دهد :
- از منوی Project گزینه Components را انتخاب کنید و در لیست Component ها مورد Microsoft WinSock 6.0 را انتخاب کنید .
- یک کنترل WinSock در فرم خود قرار دهید و نام آنرا tcpserver بگذارید
- دو textbox با نامهای txtSendData و txtReceiveData و نیز یک دکمه در فرم قرار دهید .
- کد زیر را در رویداد Form_Load بنویسید :

Tcpserver.LocalPort=1000
tcpserver.Listen

- زمانیکه درخواستی از طرف Client می آید رویداد ConnectionRequest اجرا می شود . در این رویداد ابتدا باید چک کنید که حالت کنترل بسته باشد . اگر چنین نیست اتصال را قبل از پذیرفتن اتصال جدید ببندید . سپس تقاضا را بر اساس پارامتر requestID می پذیریم :

Private Sub tcpserver_ConnectionRequest(ByVal requestID As Long)
If tcpserver.State <> sckClosed Then tcpserver.Close
tcpserver.Accept requestID
End Sub

- حال اتصال بین Client و Server برقرار شده است . کد زیر را برای event مربوط به کلیک دکمه Send بنویسید :

Tcpserver.SendData txtSendData.text

- اگر داده ای از طرف Client بیاید رویداد DataArrival اجرا می شود . کد زیر را برای این رویداد بنویسید :

Private Sub tcpserver_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpserver.GetData strData
txtReceiveData.Text = strData
End Sub

- کد زیر را برای رویداد Form_Unload بنویسید :

Tcpserver.Close

مراحل ساخت یک TCP Client بصورت زیر است :
- یک کنترل WinSock در فرم قرار دهید و نام آنرا tcpclient بگذارید .
- دو textbox با نامهای txtsend و txtreceive و نیز یک دکمه با نام sendدر فرم قرار دهید .
- یک دکمه با نام connect در فرم قرار دهید .
- کد زیر را برای متد Form_Load بنویسید :

tcpclient.RemoteHost=”yourservername”x
tcpclient.RemotePort=1000

- کد زیر را برای رویداد کلیک شدن دکمه connect بنویسید :

tcpclient.Connect

- کد زیر را برای رویداد کلیک شدن دکمه send بنویسید :

tctclient.SendData txtsend.Text

- کد زیر را برای رویداد DataArrival بنویسید :

Private Sub tcpclient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpclient.GetData strData
txtreceive.Text = strData
End Sub

- کد زیر را باری رویداد Form_Unload بنویسید :

Tcpclient.Close

کدهای فوق یک سیستم Client-Server ساده را نشان می دهد . فایل exe هر دو برنامه را بسازید و آنها را اجرا کنید تا بتوانید سیستم خود را تست کنید .
۵ – پذیرفتن بیش از یک تقاضای اتصال : Server ای که در بالا ساخته شد تنها می تواند تقاضای یک اتصال را بپذیرد . با استفاده از ایجاد یک آرایه از کنترل WinSock می توان چندین تقاضای اتصال را پذیرفت . برای اینکار کافی است یک کپی ( instance ) از کنترل بسازیم ( با تنظیم خاصیت Index ) و متد Accept را برای instance جدید بکار ببریم . فرض کنید یک کنترل WinSock با نام sckServer در فرم داریم که خاصیت Index آنرا صفر قرار داده ایم . همچنین یک متغیر intMax از نوع Long تعریف می کنیم که تعداد اتصالات همزمان به Server را نگه می دارد . در event مربوط به Form_Load کد زیر را بنویسید :

intMax=0
sckServer(0).LocalPort=1000
sckServer(0).Listen

هر بار که تقاضای یک اتصال می رسد کد ابتدا تست می کند که مقدار Index چقدر است . اگر مقدار Index صفر باشد متغیر intMax یکی افزایش می یابد و از intMax برای ساخت یک instance جدید از کنترل استفاده می شود . حال از این instance برای پذیرفتن تقاضای اتصال استفاده می گردد . برای اینکار کد زیر را برای رویداد ConnectionRequest بنویسید :

Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intmax = intmax + 1
Load sckServer(intmax)x
sckServer(intmax).LocalPort = 0
sckServer(Index).Accept requestID
End If
End Sub

6 – ایجاد اتصال UDP : ساخت یک برنامه UDP ساده تر از برنامه های TCP است زیرا پروتکل UDP به اتصال نیاز ندارد . در برنامه TCP بالا یک کنترل WinSock بایستی حتماً Listen می کرد و یک کنترل دیگر یک اتصال را توسط متد Connect ایجاد نمود . در عوض پروتکل UDP نیازی به اتصال ندارد . برای ارسال داده بین دو کنترل WinSock سه مرحله بایستی انجام شود :
- پارامتر RemoteHost برابر نام کامپیوتر مقابل است .
- پارامتر RemotePort برابر پارامتر LocalPort کامپیوتر مقابل
- استفاده از متد Bind برای مشخص کردن LocalPort
چون هر دو کامپیوتر از نظر ارتباط مساوی هستند ، این نوع برنامه ها را Peer-to-Peer گویند . برای نمونه از کد زیر برای ساخت یک برنامه chat استفاده می کنیم :
- یک کنترل WinSock در فرم قرار دهید و نام آنرا udppeerA بگذارید .
- خاصیت Protocol آنرا UDPProtocol قرار دهید .
- دو textbox با نامهای txtsend و txtreceive و نیز یک دکمه در فرم قرار دهید .
- کد زیر را برای متد Form_Load بنویسید :

udppeerA.RemoteHost=”nameofpeerB”x
udppeerA.RemotePort=1001
udppeerA.Bind 1002

- کد زیر را برای event مربوط به کلیک دکمه بنویسید :

udppeerA.SendData txtsend.text

- کد زیر را برای رویداد DataArrival بنویسید :

Dim strData as String
udppeerA.GetData strData
txtreceive.Text=strData

برای ساخت UDP peerB مشابه مراحل بالا عمل کنید فقط خاصیت RemoteHost آنرا نام کامپیوتر PeerA و خاصیت RemotePort آنرا ۱۰۰۲ و خاصیت Bind آنرا ۱۰۰۱ قرار دهید .
——————-

بررسی خواص کنترل WinSock :
ByteReceived : مقدار داده دریافت شده ( موجود در بافر receive ) را نشان می دهد . توسط متد GetData می توان این داده را دریافت نمود .
LocalHostName : نام ماشین محلی را نشان می دهد . این پارامتر فقط خواندنی است .
LocalIP : آدرس IP ماشین محلی را بصورت یک string برمی گرداند . این پارامتر فقط خواندنی است .
LocalPort : برای خواندن و یا تنظیم شماره پورت محلی بکار می رود .
Protocol : برای خواندن و یا تنظیم پروتوکل مورد استفاده توسط کنترل WinSock بکار می رود .
RemoteHost : برای خواندن و یا تنظیم نام یا آدرس IP ماشین راه دور بکار می رود .
RemoteHostIP : آدرس IP ماشین راه دور را برمی گرداند :
۱- برای برنامه های Client بعد از زمانیکه یک اتصال توسط متد Connect پذیرفته شد ، این خاصیت حاوی آدرس IP ماشین راه دور است .
۲ – برای برنامه Server ، بعد از آمدن یک Connection Request این خاصیت شامل آدرس IP ماشین راه دور است .
۳ – در زمان استفاده از پروتکل UDP بعد از اینکه رویداد Data Arrival رخ داد این خاصیت حاوی آدرس IP ماشینی است که داده را فرستاده .
RemotePort : برای خواندن و یا تنظیم شماره پورت ماشین راه دوری که می خواهید به آن متصل شوید بکار می رود .
SocketHandle : مقداری را برمی گرداند که مرتبط با سوکتی است که کنترل WinSock را مدیریت می کند و برای ارتباط با لایه WinSock بکار می رود . این پارامتر فقط خواندنی است و تنها برای ارسال به API های WinSock طراحی شده است .
State : وضعیت کنترل WinSock را نشان می دهد . وضعیتهای ممکن برای State عبارتند از :
۱ – sckClosed : اتصال بسته است .
۲ – sckOpen : اتصال باز است .
۳ – sckListening : حالت گوش دادن به پورت
۴ – sckConnectionPending : معلق شدن اتصال
۵ – sckResolvingHost : تصمیم گیری در مورد میزبان
۶ – sckHostResolved : در مورد میزبان تصمیم گیری شد .
۷ – sckConnecting : حالت برقراری ارتباط
۸ – sckConnected : ارتباط برقرار شد .
۹ – sckClosing : حالت قطع اتصال
۱۰ – sckError : حالت خطا

بررسی متدهای کنترل WinSock :
متد Accept : تنها برای برنامه های TCP Server بکار می رود . این متد برای پذیرفتن یک اتصال در زمان مدیریت رویداد ConnectionRequest استفاده می شود .
متد Bind : این پارامتر LocalPort و LocalIP یک اتصال را مشخص می کند .
متد Close : برای بستن یک اتصال TCP و یا بستن یک listening socket بکار می رود .
متد GetData : بلوک جاری داده دریافت شده را گرفته و آنرا در متغیری از نوع Variant ذخیره می کند . شکل کلی این متد بصورت زیر است :

WinSock.GetData data[,type][,maxlen]x

که data داده دریافتی است . اگر داده کافی موجود نباشد data برابر empty خواهد بود .
type نوع داده دریافتی است که می تواند مقادیر زیر باشد :
vbByte – vbInteger – vbLong – vbSingle – vbDouble – vbDate – vbBoolean – vbError – vbString – vbArray+vbByte
maxlen حداکثر سایز را در زمان دریافت یک byte Array و یا یک string مشخص می کند .
متد Getdata در رویداد Data Arrival استفاده می شود که این رویداد یک پارامتر با نام TotalBytes دارد . اگر maxlen ای که شما تعیین کرده اید کمتر از TotalBytes باشد پیغام هشدار شماره ۱۰۰۴۰ دریافت می کنید بدین معنی که بایتهای باقیمانده گم خواهند شد .
متد Listen : یک سوکت می سازد و آنرا در حالت Listen قرار می دهد . این متد تنها در اتصالات TCP بکار میرود .
متد PeekData : مشابه GetData است با این تفاوت که داده را از صف ورودی حذف نمی کند . این متد تنها برای اتصالات TCP بکار می رود .
متد SendData : برای ارسال داده به کامپیوتر راه دور بکار می رود .
بررسی event های کنترل WinSock :
رویداد Close : زمانی رخ می دهد که کامپیوتر راه دور اتصال را ببندد .
رویداد Connect : بعد از اینکه یک اتصال به Server ایجاد شد روی می دهد . شکل کلی آن بصورت زیر است :

Private Sub WinSock_Connect(ErrorOccurred As Boolean)x

که پارامتر ErrorOccurred دو مقدار دارد : اگر True باشد یعنی اتصال Fail شده است و اگر False باشد یعنی اتصال با موفقیت انجام شده است .
با رویداد Connect می توانید error هایی که در زمان فرایند باز کردن اتصال برگردانده شده را چک کنید .
رویداد ConnectionRequest : زمانی رخ می دهد که یک کامپیوتر راه دور تقاضای یک اتصال را بدهد . این رویداد فقط برای برنامه های TCP Server بکار می رود .
رویداد DataArrival : زمانی رخ می دهد که داده جدیدی بیاید .
رویداد Error : زمانی رخ می دهد که یک خطا در فرایند ارتباط رخ دهد ( مثلاً Failed to Connect و یا Failed to Send ) . شکل کلی آن بصورت زیر است :

Private WinSock_Error(number as Integer,description as String,scode as Long,source as String,helpfile as String,helpcontext as Long,canceldisplay as Boolean)x

number شماره کد خطا است .
description توضیحی در مورد خطا است .
source توصیف منبع خطا
canceldisplay : مشخص می کند آیا پیغام خطای پیش فرض نشان داده شود یا نه
رویداد SendComplete : زمانی رخ می دهد که یک عمل Send تکمیل شده باشد .
رویداد SendProgress : زمانی رخ می دهد که کنترل شروع به ارسال داده نماید . شکل کلی آن بصورت زیر است :

WinSock_SendProgress (bytesSent As Long, bytesRemaining As Long)x

که bytesSent تعداد بایتهای ارسال شده و bytesRemaining تعداد بایتهای باقیمانده است

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن