کار با کنترل winsock
کنترل winsock به شما اجازه می دهد به یک ماشین راه دور متصل شده و داده ها را با استفاده از پروتکل TCP و UDP مبادله کنید.
هر دو پروتکل می توانند برای برنامه های client و server استفاده شوند.
موارد استفاده :
ساختن یک برنامه client که اطلاعات کاربر را قبل از فرستادن به سمت server جمع آوری می کند.
ساختن بک برنامه server که به عنوان بک نقطه مرکزی مجموعه برای داده های چندین کاربر می باشد.
ساخت یک برنامه chat
و موارد دیگر ...
Socket :
عاملی است برای برنامه نویسی تحت اینترنت که از طریق آن دو برنامه ، دو پروسه در شبکه مشخص می شوند .بنابراین اطلاعات ارسال شده یا دریافت شده از طریق این شماره منحصر به فرد یا عامل منحصر به فرد مسیر خود را پیدا می کند.
انتخاب یک پروتکل :
وقتی از کنترل winsock استفاده می کنید باید به این مسئله رسیدگی کنید که کدامیک از پروتکل های TCP و UDP را می خواهید استفاده کنید .
تفاوت اصلی بین این دو در حالت اتصال آنها می باشد :
پروتکل TCP یک پروتکل اتصال – پایه است و مانند تلفن کاربر باید قبل از اقدام به ارسال اطلاعات یک ارتباط ایجاد کند.
پروتکل UDP یک پروتکل بدون اتصال است و مبادله اطلاعات بین دو کامپیوتر مانند ارسال پیغام است : یک پیغام از یک کامپیوتر برای یکی دیگر ارسال می شود اما ارتباط بین آن دو واضح نیست .
حداکثر اندازه داده ارسال شده به صورت منحصر به فرد ، بوسیله شبکه تعیین می شود .
ساخت یک client :
وظیفه برنامه client side application : فرایند یا برنامه ای که در سمت مشتری برای استفاده از یک سرویس وب اجرا می شود .
عملیاتی که توسط client side application انجام می شود:
در خواست اتصال به برنامه server (عمل connect )
عمل ارسال اطلاعات به سمت server
دریافت اطلاعات از server
1- برای شروع سا خت برنامه client ابتدا ویژوال بیسیک را باز کرده و یک پروژه استاندارد را انتخاب و سپس آنرا باز می کنیم
سپس در قسمت ابزار راست کلیک کرده و گزینه components...
را انتخاب می کنیم .
از صفحه ای که باز می شود گزینه Microsoft WinSock Control 6 را انتخاب می کنیم 4- بعد از زدن دکمه ok دو کامپیوتر کوچک پشت سرهم در کنار نوار ابزار پدیدار می شوند .
5- سپس روی آن کلیک کرده و آنرا برروری فرم خود قرار دهید .
نام آنرا به sockc تغییر دهید .
Winsock یکی از ابزارهای برقراری ارتباط از طریق پورتهای TCP و UDP بین server و client در ویژوال بیسیک می باشد .
تقریبا تمام ارتباطات استاندارد در ویژوال بیسیک از این طریق انجام می گیرد .
6- بعد از انجام مراحل بالا 5 Textbox به فرم مورد نظر خود اضافه می کنیم سپس بر روی فرم مورد نظر خود دو بار راست کلیک می کنیم تا وارد محیط کد نویسی شویم .
سپس در form_load( ) برنامه خود کدهای زیر را اضافه می کنیم .
Private Sub cmdConnect_Click() If sockc.state = 0 Then sockc.RemoteHost = txtip.Text sockc.RemotePort = txtport.Text sockc.Connect Label3.Caption = status(sockc.state) txtsend.SetFocus Else sockc.Close Label3.Caption = status(sockc.state) End If Label3.Caption = status(sockc.state) End Sub تنظیم پروتکل : برای تنظیم پروتکل شما می توانید از یکی از دو حالت sckTCPProtocol و sckUDPProtocol استفاده کنید که ما در اینجا از خاصیت sckTCPProtocol استفاده کرده ایم .
مشخص کردن نام کامپیوتر : برای اتصال به کامپیوتر راه دور شما باید IP ویا نام دوستانه آنرا بدانید.
IP کامپیوترهای شخصی 127.0.0.1 می باشد که این رشته را به عنوان مقدار برای خاصیت RemoteHost قرار می دهیم .
مشخص کردن پورت کامپیوتر ها : برای اینکه کامپیوتر های راه دور بتوانند با یکدیگر ارتباط برقرار کنند بایستی یک شماره پورت برای نرم افزارهای دو طرف یعنی client و server انتخاب می کنیم که در واقع نرم افزارها از طریق این پورت با یکدیگر ارتباط برقرار می کنند .و این پورت به عنوان ورودیها و خروجیهای دو نرم افزار عمل می کند که ما در اینجا مقدار خاصیت RemotePort را برابر رشته 5050 قرار داده ایم .
سپس مقدار دو socks.protocolو socks.local port را به ترتیب برابر با 127.0.0.1 و 5050 قرار داده ایم که وقتی برنامه client اجرا می شود برای کاربر مشخص شود که برنامه بر روی چه IP و پورتی کار می کند .
بعد از این کار مقدار را برابر مقداری که یک تابع بر می گرداند قرار داده ایم .
کار این تایع به این صورت است که در هر لحظه وضعیت برنامه client را مشخص می کند در واقع sockc.state داخل پرانتز یک عدد را برمی گرداند .
تعریف تابع status : unction status(state As Integer) Select Case state Case 0 status = "closed" Case 1 status = "open" Case 2 status = "listening..." Case 6 status = "connecting..." Case 7 status = "connected" Case 9 status = "ERROR" End Select End Function در اینجا برای انتخابهای 0 تا 9 مقدار status را با یک پیغام مناسب مقدار دهی کرده ایم .
کد برنامه Chat 1-Chat 1 ---------------------------------- Client ---------------------------------- Option Explicit Private Sub cmdClose_Click() sockc.Close End Sub Private Sub cmdConnect_Click() If sockc.state = 0 Then sockc.RemoteHost = txtip.Text sockc.RemotePort = txtport.Text sockc.Connect Label3.Caption = status(sockc.state) txtsend.SetFocus Else sockc.Close Label3.Caption = status(sockc.state) End If Label3.Caption = status(sockc.state) End Sub Private Sub cmdSend_Click() If sockc.state = sckConnected Then sockc.SendData txtsend.Text Label3.Caption = "Sending Data" Else Label3.Caption = "Not connected to host" End If End Sub Private Sub sockc_DataArrival(ByVal bytesTotal As Long) Dim sData As String sockc.GetData sData,vbString txtget.Text = sData Label3.Caption = "Received Data" End Sub Private Sub sockc_SendComplete() Label3.Caption = "Data Send" End Sub Function status(state As Integer) Select Case state Case 0 status = "closed" Case 1 status = "open" Case 2 status = "listening..." Case 6 status = "connecting..." Case 7 status = "connected" Case 9 status = "ERROR" End Select End Function Server ------------------------------------- Function Status (State As Integer) Select Case state Case 0 status = "closed" Case 1 status = "open" Case 2 status = "listening..." Case 6 status = "connecting..." Case 7 status = "connected" Case 9 status = "ERROR" End Select End Function Private Sub Form_Load() socks.Protocol = sckTCPProtocol socks.LocalPort = 5050 socks.listen lblhost.Caption = socks.LocalHostName lblip.Caption = socks.LocalIP lblstatus.Caption = status(socks.state) End Sub Private Sub listen_Click() If socks.state = sckClose Then socks.listen Else socks.Close End If lblstatus.Caption = status(socks.state) End Sub Private Sub Send_Click() If socks.state = sckConnected Then socks.SendData sendtxt.Text Else MsgBox "Not Connected To Server Please Check Again", vbExclamation, " ALERT" End If lblstatus.Caption = status(socks.state) End Sub Private Sub socks_Close() socks.Close socks.listen lblstatus.Caption = status(socks.state) End Sub Private Sub socks_ConnectionRequest(ByVal request ID As Long) socks.Close socks.Accept request ID lblstatus.Caption = status(socks.state) End Sub Private Sub socks_DataArrival(ByVal bytesTotal As Long) Dim data As String socks.GetData data gettxt.Text = data lblstatus.Caption = status(socks.state) End Sub Chat 1-Chat n ----------------------------------- client ----------------------------------- Private Sub Command1_Click() If Winsock1.State = sckClosed Then Winsock1.Connect Else Winsock1.Close End If End Sub Private Sub Command2_Click() If Winsock1.State = sckConnected Then Winsock1.SendData Text1.Text Else MsgBox ("connection does not valid") End If End Sub Private Sub Form_Load() Winsock1.RemoteHost = "localhost" Winsock1.RemotePort = 1001 End Sub Private Sub Winsock1_Close() Winsock1.Close End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim strdata As String Winsock1.GetData strdata Text2.Text = strdata End Sub Private Sub Winsock1_Error(ByVal Number As Integer,Description As String, ByVal Scode As Long,ByVal Source As String,ByVal HelpFile As String,ByVal HelpContext As Long,CancelDisplay As Boolean) MsgBox "socket on ( " & Form1.Caption & " )ERROR : " & Description Winsock1.Close End Sub Server ----------------------------------- Private intmax As Long Private Sub Command1_Click() Winsock1(Val(Text3.Text)).SendData Text1.Text End Sub Private Sub Form_Load() intmax = 0 Winsock1(0).LocalPort = 1001 Winsock1(0).Listen End Sub Private Sub Winsock1_Close(Index As Integer) Unload Winsock1(Index) End Sub Private Sub Winsock1_ConnectionRequest(Index As Integer,ByVal request ID As Long) If Index = 0 Then intmax = intmax + 1 Load Winsock1(intmax) Winsock1(intmax).LocalPort = 0 Winsock1(intmax).Accept request ID Load Text2(intmax) End If End Sub Private Sub Winsock1_DataArrival(Index As Integer,ByVal bytesTotal As Long) Dim strdata As String Winsock1(Index).GetData strdata Text2(Index).Text = strdata List1.AddItem Text2(Index).Text & "-->" & Str(Index) Text3.Text = Index End Sub درارتباط با پروژه توضیحات کد برنامه: Client ---------------------------------- Option Explicit Private Sub cmdClose_Click() sockc.Close End Sub این تابع برای این است که تمام client ها را ببندد وبعد ادامه کاررا انجام دهد.
Private Sub cmdConnect_Click() If sockc.state = 0 Then sockc.RemoteHost = txtip.Text sockc.RemotePort = txtport.Text sockc.Connect Label3.Caption = status(sockc.state) txtsend.SetFocus Else sockc.Close Label3.Caption = status(sockc.state) End If Label3.Caption = status(sockc.state) End Sub در اینجا وضعیت client را بررسی می کندکه آیا از قبل connect هست یا نه.اگرconnect باشدآنرا می بندد( closed ).
از sockc.RemoteHost = txtip.Text sockc.RemotePort = txtport.Text برای شناسایی port و نمایش آدرس شخص فرستنده به صورت رشته استفاده می شود.
بعد connect می شود.
txtsend.SetFocus در واقع ایجاد یک ناظر بین client و server می باشد که نظاره گر آن ها می باشدومراقب ارسال و دریافت داده ها است.
در غیراینصورت client را می بندد.
Private Sub cmdSend_Click() If sockc.state = sckConnected Then sockc.SendData txtsend.Text Label3.Caption = "Sending Data" Else Label3.Caption = "Not connected to host" End If End Sub بررسی می کند که آیا وصل( connected ) هست یا نه.
اگروصل بود داده را به صورت متن ارسال می کند وبرچسب sending data نمایان می شود.
در غیراینصورت برچسب Not connected to host ظاهر می گردد.
Private Sub sockc_DataArrival(ByVal bytesTotal As Long) Dim sData As String sockc.GetData sData,vbString txtget.Text = sData Label3.Caption = "Received Data" End Sub این تابع برای تعریف متغیرها استفاده می شود.
درآن آرایه ای با نام sData تعریف شده و خروجی آن رشته می باشد.
وجهت مرتبط ساختن به sockc از GetData استفاده می کند.در اینجا دو متغیر sData,vbString داریم.
خروجی آن از نوع متن می باشد.
وهنگامی که داده را دریافت می کند برچسب Received Data نمایان می شود.
Private Sub sockc_SendComplete() Label3.Caption = "Data Send" End Sub این تابع برای ارسال است.هنگامی که داده فرستاده می شود برچسب Data Send نمایان می شود.
Function status(state As Integer) Select Case state Case 0 status = "closed" Case 1 status = "open" Case 2 status = "listening..." Case 6 status = "connecting..." Case 7 status = "connected" Case 9 status = "ERROR" End Select End Function این تابع جهت بررسی وضعیت می باشد.
اگر 0 بود آن را می بندد اگر 1 بود آن را باز می کند اگر 2 بود وقفه ایجاد می کند......وبه همین ترتیب تا آخر.
Server ------------------------------------ Function Status (State As Integer) Select Case state Case 0 status = "closed" Case 1 status = "open" Case 2 status = "listening..." Case 6 status = "connecting..." Case 7 status = "connected" Case 9 status = "ERROR" End Select End Function همانطور که گفته شد این تابع بررسی وضعیت می باشد.
Private Sub Form_Load() socks.Protocol = sckTCPProtocol socks.LocalPort = 5050 socks.listen lblhost.Caption = socks.LocalHostName lblip.Caption = socks.LocalIP lblstatus.Caption = status(socks.state) End Sub می دانیم که دو نوع پروتکل وجود دارد.
UDP و TCP IP .
که در UDP نیازی به اتصال نمی باشدولی در TCPIP می بایست حتما ارتباط یا عدم ارتباط بررسی شود.
دراین برنامه از پروتکلTCP IP استفاده می شود.
lblhost.Caption = socks.LocalHostName برای شناسایی شخص میزبان (که در server قراردارد ) به کار می رود.
lblip.Caption = socks.LocalIP مکان آدرس IP را پیدا می کند.
lblstatus.Caption = status(socks.state) وضعیت socket را نشان می دهد که آیا فعال هست یا خیر.
Private Sub listen_Click() If socks.state = sckClose Then socks.listen Else socks.Close End If lblstatus.Caption = status(socks.state) End Sub این شرط وضعیت client را چک می کند.
اگر close باشد یک وقفه ایجاد می کند.
در غیراینصورت همان ابتدا تمام clientهارا close می کند.
lblstatus.Caption = status(socks.state) هم وضعیت socket را نشان می دهد.
Private Sub Send_Click() If socks.state = sckConnected Then socks.SendData sendtxt.Text Else MsgBox "Not Connected To Server Please Check Again", vbExclamation, " ALERT" End If lblstatus.Caption = status(socks.state) End Sub این تابع در صورت متصل بودن portاجازه ارسال داده را می دهد و داده را به صورت متن ارسال می کند.
در غیر اینصورت پیغام Not Connected To Server Please Check Again را مبنی بر این که ارتباط برقرار نیست نمایش می دهد.
Private Sub socks_Close() socks.Close socks.listen lblstatus.Caption = status(socks.state) End Sub این تابعclientها را می بندد.
وقفه ای ایجاد می کند.
و وضعیت socket را نشان می دهد.
Private Sub socks_ConnectionRequest(ByVal request ID As Long) socks.Close socks.Accept request ID lblstatus.Caption = status(socks.state) End Sub این تابع برای درخواست ارتباط است.
برای این کار باید تمامی clientها بسته شوند.
آدرسIP پذیرفته شود.
وضعیت socket