VB实现自动取得服务器IP并连接服务器(利用UDP广播)
2016-03-11 13:02
567 查看
普通的讲解WINSOCK控件等网络控件的用法的资料中,无论是使用TCP还是UDP,客户端程序连接服务端程序时,无一例外的要指定IP地址(或机器名)和端口号,那么,在端口已知而服务端程序所在机器地址或名称未知的情况下,怎样实现客户端程序自动取得服务端IP并建立连接呢,笔者在实际编程中遇到了这种情况,并使用以下方法解决了这个问题。
这种方法就是服务器端添加两个Winsock控件,一个作为服务端,一个以UDP来广播本机IP,客户端也用UDP方式取得服务器IP,然后再将客户端改为TCP方式来向服务器发起连接。完整代码如下:
这种方法就是服务器端添加两个Winsock控件,一个作为服务端,一个以UDP来广播本机IP,客户端也用UDP方式取得服务器IP,然后再将客户端改为TCP方式来向服务器发起连接。完整代码如下:
'服务器端程序加代码(程序出处www.ibiancheng.cn) '新建一个工程,然后在窗体上放两个个Winsock控件,名为Winsock1和Winsock2 '一个定时器控件Timer1,Interval属性设置为1000(也可以自己设置) '---------------------向整个网络广播本机IP--------------------------- Dim MeIp As String '储存本机IP Dim netmask As String '储存本机广播地址 Dim maxconnext As Long Dim nowconnext() As Boolean '--------------------------------------------------------- Private Sub Form_Load() Winsock1.Protocol = sckUDPProtocol Winsock1.RemotePort = 9400 '绑顶远程端口号9400 MeIp = Winsock1.LocalIP '获得本机IP地址 netmask = "127.0.0.255" '为本机广播地址,广播地址请按自己的IP计算 '----------------------------------------- Winsock2(0).LocalPort = 1001 Winsock2(0).Listen End Sub '-----------------------开始向整个网络广播本机IP-------------------------- Private Sub Timer1_Timer() '向本网广播地址发送信息 Winsock1.RemoteHost = netmask '向本网广播地址发送信息,内容是本机的IP地址 Winsock1.SendData MeIp End Sub Private Sub Winsock2_Close(Index As Integer) Winsock2(Index).Close Winsock2(Index).LocalPort = 1001 Winsock2(Index).Listen End Sub '服务器端收到客户端的连接请求,这里的代码可能有点问题,请自己重新写或联系我 Private Sub Winsock2_ConnectionRequest(Index As Integer, ByVal requestID As Long) On Error Resume Next Dim i As Long If Index = 0 Then '主Winsock——Winsock(0)发生消息 i = 1 While i <= maxconnext And nowconnext(i) '在以前的Winsock中找到空闲的Winsock i = i + 1 DoEvents Wend If i <= maxconnext Then '在当前装载的Socket中发现有用户已经离开 Winsock2(i).LocalPort = 0 '使用现成的Socket Winsock2(i).Accept requestID '接收 nowconnext(i) = True 'Winsock(i)被占用 Else '在当前装载的Socket中没发现有用户离开 maxconnext = maxconnext + 1 '当前接收端口增加 Load Winsock2(maxconnext) '生成新的’ Winsock Winsock2(maxconnext).LocalPort = 0 Winsock2(maxconnext).Accept requestID '接收 ReDim Preserve nowconnext(maxconnext + 1) nowconnext(maxconnext) = True End If End If End Sub '------------------------------------------------------- '客户端程序(程序出处www.ibiancheng.cn) '新建一个工程,然后在窗体上放一个Winsock控件,名为Winsock1 '----------------------------- Dim CanSend As String '保存服务端IP '---------------------------- Private Sub Form_Load() '-------------------------------------- Winsock1.Protocol = sckUDPProtocol '初始化连接方式 Winsock1.Bind "9400" '从9400端口侦听 '---------------------------------------- Winsock2.RemoteHost = "1001" End Sub '----------------------------------------------------------- Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) DoEvents Dim DataArrival As String Dim Cip As String Winsock1.GetData DataArrival CanSend = DataArrival '取得服务端IP Winsock1.Close '断开连接 Winsock1.LocalPort = 0 '改端口号为0 Winsock1.Protocol = sckTCPProtocol ' 改变连接方式 Winsock1.RemotePort = 1001 '设置服务器端口号 Winsock1.RemoteHost = CanSend '请求连接服务器 Winsock1.Connect End Sub
相关文章推荐
- navBarControl设置左折叠
- vb计时器制作第二节
- 动态添加权限navBarControl1设置 DXperience学习笔记
- Ubuntu vbox虚拟机和win系统建立共享文件夹
- 色谱峰的类型BB,BV,VB等都是什么意思
- vb.net 获取当前程序的版本(软件自己的版本)
- VBA教程初级(五):复杂数组
- VB Modbus Rtu 读
- VB6为报表盖电子图章
- 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]
- 0xC0000005: Access Violation
- VBA里的颜色常数
- KVC and KVO KVB
- VB 知识点总结
- H264三种码率控制方法(CBR, VBR, CVBR)
- 【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集
- 【VBA研究】变量定义的类型和实际赋值类型
- 在.net(C# or vb.net)中如何用户自定义消息,并在窗体中处理这些消息
- VB.NET 的 DES 加密与解密(转载于nofort博客)
- VB.NET视频总结