(南京審計學院教育技術中心 210029 丁國勇)
在一般的講解WINSOCK控件的用法的文章中,無論是使用TCP還是UDP,客戶端程序連接服務端程序時無一例外的要指定IP地址(或機器名)和端口號,那么,在端口已知而服務端程序所在機器地址或名稱未知的情況下,怎樣實現客戶端程序發起并建立連接呢,筆者在實際編程中遇到了這種情況,并使用如下方法解決了這個問題。
這種方法巧妙的將 TCP與UDP結合起來,概括起來就是UDP查找,TCP連接。
對于客戶端程序,使用了三個WINSOCK 控件:
1 sockclient 協議sckTcpprotocol 用于向服務端程序發起TCP連接
2 socklink 協議sckUdpprotocol 用于向本網廣播地址發送數據
3 sockgetdata 協議sckUdpprotocol 用于接受從服務端程序返回的信息
定義一個String類型全局變量 MeIp,用于存放本機的IP地址。
在Form_load()事件中,編寫如下程序:
Dim netbcaddress As String
MeIp = socklink.LocalIP 獲得本機IP地址
netmask存放本網的廣播地址,
假設IP地址為192.168.100.215,子網掩碼為255.255.255.0
則該網的廣播地址即為192.168.100.255,從本機IP地址怎樣得到
廣播地址請讀者自己考慮。
sockgetdata.Bind "9400" ' 綁定到本地端口9400
socklink.RemoteHost = netmask '向本網廣播地址發送信息,內容是本機的IP地址
socklink.RemotePort = 9401
socklink.SendData "dgy.." & MeIp
在sockgetdata的DataArrival里這樣定義
Private Sub sockgetdata_DataArrival(ByVal bytesTotal As Long)
Dim StrData As String
sockgetdata.GetData StrData '取得數據,數據為服務端程序所在機器的IP地址
If Trim(StrData) <> "" Then
sockclient.RemoteHost = StrData '客戶端程序與服務端程序建立連接。
sockclient.RemotePort = 8092
sockclient.Connect
End If
End Sub
在服務端程序中,則要從廣播地址獲得客戶端的IP地址,并將自己的IP地址發送到客戶端,讓客戶
端與自己建立連接.
服務端程序中,同樣也用到如下三個winsock控件:
1 sockserver控件數組 協議sckTcpprotocol 用于接受客戶端的TCP連接
2 sockgetdata 協議sckUdpprotocol 用于從廣播地址獲得客戶端的IP地址
3 sockudpsend 協議sckUdpprotocol 用于向客戶端發送服務端程序的IP地址
在Form_load()中
sockgetdata.Bind "9401" '從9401端口偵聽
定義如下結構和函數用于分離數據
Option Explicit
Private Type UdpData
ok As Boolean
IP As String
End Type
Private Function UdpDataSwitch(UdpData As String) As UdpData
Dim p As String
Dim MyStrs As Variant
Dim strs As Variant
p = ""
MyStrs = Split(UdpData, "..")
For Each strs In MyStrs
If p = "dgy" Then
UdpDataSwitch.ok = True
UdpDataSwitch.IP = strs
Exit Function
End If
p = strs
Next
UdpDataSwitch.ok = False
UdpDataSwitch.IP = ""
End Function
在sockgetdata的DataArrival事件中
Private Sub sockgetdata_DataArrival(ByVal bytesTotal As Long)
DoEvents
Dim DataArrival As String
Dim CanSend As Boolean
Dim Cip As String
sockudplink.GetData DataArrival
CanSend = UdpDataSwitch(DataArrival).ok
If CanSend = True Then
sockudpsend.RemoteHost = UdpDataSwitch(DataArrival).IP
sockudpsend.RemotePort =9400
sockudpsend.SendData sockudpsend.LocalIP
End If
End Sub
至于sockserver 怎樣響應sockclient 的連接請求,看一般的介紹winsock編程的文章就可以
得到答案。
這樣,就能完成在端口已知而服務端程序所在機器地址或名稱未知的情況下,巧妙使用UDP和TCP,完成客戶端程序與服務端程序的連接。
關于在VB中怎樣得到本機所在網絡的廣播地址(特別是在動態獲得IP地址的情況下),歡迎大家來信與我探討 netmuse@njai.edu.cn
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/
領測軟件測試網最新更新
關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月