vb的UDP广播 100

我正在用VB编一个网络小工具,由一个SERVER和多个CLIENT,在局域网中,我想从SERVER发送UDP广播到每个CLIENT。现在的问题是如何发送这个广播信号呢??... 我正在用VB编一个网络小工具,由一个SERVER和多个CLIENT,在局域网中,我想从SERVER发送UDP广播到每个CLIENT。现在的问题是如何发送这个广播信号呢??还需要获得子网吗???
用的是WINSOCK控件
在SERVER发送广播前,仅知道自己的IP地址,并不知道CLIENT的地址.
展开
 我来答
niaoked
2006-02-13
知道答主
回答量:16
采纳率:0%
帮助的人:19.6万
展开全部
方案:
所有的CLIEN的WINSOCK全用控件数组。
如:
CLIENT(0)
然后在要广播的时候
sub BroadCoast()
for I =0 to client.count-1
if client(i).state=7 then
client(i).senddata
end if
next
end sub
给你帖一个我的游戏服务器代码:

Private Sub Command1_Click()
Dim intI As Integer
For I = 0 To 最大人数
If Ws(I).State <> 0 Then Ws(I).Close
Next
End
End Sub
Private Sub Command2_Click()
Dim TheIndex As Long
Dim Response
TheIndex = CLng(LsUser.ListIndex)
If TheIndex = -1 Then Exit Sub
Response = MsgBox("真的要把用户" & 用户(CInt(TheIndex)).用户名 & "删除下线吗?" & TheIndex, vbOKCancel + vbQuestion)
If Response = vbOK Then
Dim KillReson As String
KillReson = InputBox("请输入踢用户下线的理由:", "踢用户下线", "")
If Len(KillReson) = 0 Then Exit Sub
FrmMain.Ws(TheIndex + 1).SendData Encrypt("444$" & KillReson, LngKeyE, LngKeyD, LngKeyN)
DoEvents
'Call KillUser(CInt(TheIndex))
Else
Exit Sub
End If
End Sub

Private Sub Command3_Click()
Dim I, K As Long
For I = 0 To LsUser.ListCount - 1
'If Trim(LsUser.Text) = 用户(I + 1).用户名 And 用户(I + 1).用户状态 = 0 Then
' LsUser.RemoveItem I + 1
' End If
For K = 1 To 最大人数
If Trim(LsUser.List(I)) = 用户(K).用户名 And 用户(K).用户状态 = 0 Then
LsUser.RemoveItem CInt(用户(K).在线列表号)
End If
Next
Next
Labonline.Caption = "当前在线:" & LsUser.ListCount & "人"
End Sub

Private Sub Form_Load()
Dim I As Long
最大人数 = 5
当前连接号 = 1
For I = 2 To 最大人数
Load Ws(I)
DoEvents
Next
WsListen.LocalPort = "1982"
WsListen.Listen
DeBugs ("服务器已经准备就绪" & vbCrLf & "共加载个" & 最大人数 & "连接" & vbCrLf & "服务IP:" & WsListen.LocalIP & vbCrLf & "端口:" & WsListen.LocalPort)
Call ConnData
Me.Show
End Sub

Private Sub Form_Unload(Cancel As Integer)
For I = 1 To 最大人数
If Ws(I).State <> 0 Then
Ws(I).Close
End If
Next
End Sub

Private Sub LsUser_Click()
Dim strTheU, Uindex() As String
strTheU = Trim(LsUser.Text)
strTheU = "用户名:" & 用户(CLng(LsUser.ListIndex + 1)).用户名 & vbCrLf
strTheU = strTheU & "昵 称:" & 用户(CLng(LsUser.ListIndex + 1)).昵称 & vbCrLf
strTheU = strTheU & "积分:" & 用户(CLng(LsUser.ListIndex + 1)).积分 & vbCrLf
strTheU = strTheU & "胜:" & 用户(CLng(LsUser.ListIndex + 1)).胜 & vbCrLf
strTheU = strTheU & "败:" & 用户(CLng(LsUser.ListIndex + 1)).败 & vbCrLf
strTheU = strTheU & "团 队:" & 用户(CLng(LsUser.ListIndex + 1)).团队名 & vbCrLf
strTheU = strTheU & "职 务:" & 用户(CLng(LsUser.ListIndex + 1)).职务 & vbCrLf
strTheU = strTheU & "IP:" & 用户(CLng(LsUser.ListIndex + 1)).IP & vbCrLf
strTheU = strTheU & "连接号:" & 用户(CLng(LsUser.ListIndex + 1)).连接号 & vbCrLf
strTheU = strTheU & "用户状态:" & 用户(CLng(LsUser.ListIndex + 1)).用户状态 & vbCrLf
Lu.Caption = strTheU
End Sub

Private Sub Ws_Close(Index As Integer)
Ws(Index).Close
用户(Index).用户状态 = 0
Call RemoteUser(CLng(Index))
DeBugs ("用户:" & 用户(Index).用户名 & "离开了游戏")
End Sub

Private Sub Ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim sData As String
Dim ClsData As New Data
If bytesTotal = 0 Then
MsgBox "收到的数据为空"
Ws(Index).Close: Exit Sub
End If
Ws(Index).GetData sData, vbString
DoEvents
Call ClsData.DataControl(sData, Index)
DeBugs ("收到包:" & sData)
End Sub

Private Sub Ws_Error(Index As Integer, 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)
DeBugs (Err.Description)
End Sub

Private Sub WsListen_ConnectionRequest(ByVal requestID As Long)
Dim I As Long
'//首先按顺序接收请求.
For I = 当前连接号 To 最大人数
If Ws(I).State = 0 Then
Ws(I).Accept requestID
DeBugs ("接收到远程用户的连接请求(" & Ws(I).RemoteHostIP & ")")
当前连接号 = I
Exit For
End If
Next
'///如果按顺序没有空连接,则查看前面有没有退出的用户
If I = 最大人数 Then
For I = 1 To 当前连接号
If Ws(I).State = 0 Then
Ws(I).Accept requestID
Else
'WsBusy.Accept requestID
' If WsBusy.State = 7 Then
'WsBusy.SendData "服务已经满了...."
'WsBusy.Close
' End If
End If
Next
End If
End Sub
Sub DeBugs(Str)
txtDebug.Text = txtDebug.Text & Str & vbCrLf
End Sub

Public Function Login(Index As Integer, UserName As String, UserPass As String) As String
If UserName = "" Or UserPass = "" Then Login = Encrypt("999$用户名密码不能为空", "", "", "")
Dim strSql As String
Dim RsLogin As New ADODB.Recordset
strSql = "select sex,score,win,lose,groups,positions,pic,nick,lastlogintime from [user] where username='" & UserName & "' and userPass='" & UserPass & "'"
If RsLogin.State = 1 Then RsLogin.Close
RsLogin.Open strSql, Conn, 1, 3
If RsLogin.EOF Or RsLogin.BOF Then
Login = Encrypt("404$用户名或是密码错误", "", "", "")
Else
RsLogin("LastLoginTime") = Now
Dim K As Integer
Dim Plain() As String
'性别+积分+胜+输+团队+职务+头像+昵称
Ustr(Index) = ""
For K = 0 To RsLogin.Fields.Count - 1
Ustr(Index) = Ustr(Index) & RsLogin(K) & "$"
Next
Plain = Split("$" & Ustr(Index), "$")
With 用户(Index)
.连接号 = Index
.用户名 = UserName
.密码 = UserPass
.用户状态 = 1
.头像 = Plain(7)
.胜 = Plain(3)
.败 = Plain(4)
.昵称 = Plain(8)
.团队名 = Plain(5)
.职务 = Plain(6)
.积分 = Plain(2)
.性别 = Plain(1)
.IP = Ws(Index).RemoteHostIP
End With
LsUser.AddItem UserName
用户(Index).在线列表号 = LsUser.ListCount - 1
LsUser.Refresh
Labonline.Caption = "共有" & LsUser.ListCount & "人在线"
Login = "20$" & Ustr(Index) & "$" & 用户(Index).连接号
End If
' If RsLogin.State = 1 Then RsLogin.Close
End Function

Public Sub KillUser(Index As Integer)
If Index < 0 Then Exit Sub
Ws(Index + 1).Close
用户(Index + 1).用户状态 = 0
Call RemoteUser(Index + 1)
End Sub
Public Sub RemoteUser(Index As Integer)
' On Error Resume Next
If Index = -1 Then Exit Sub
Dim I As Long
For I = 0 To LsUser.ListCount - 1
If Trim(LsUser.List(I)) = Trim(用户(Index).用户名) Then
LsUser.RemoveItem I
LsUser.Refresh
Labonline.Caption = "共有" & LsUser.ListCount & "人在线"
'Exit For
End If
Next
End Sub

Public Function OnlineUser(Index As Integer, Hall As Integer)
Dim I As Long
Dim strOnUser As String
For I = 0 To 最大人数
If 用户(I).游戏ID = Hall And Len(用户(I).用户名) > 0 And 用户(I).连接号 <> Index And 用户(I).用户状态 = 1 Then
OnUser = OnUser & "###" & 用户(I).所在桌 & "$" & 用户(I).所在座 & "$" & Ustr(I) & "$" & 用户(I).用户名 & "$" & 用户(I).连接号 & "$" & 用户(I).IP
FrmMain.DeBugs ("user:" & I & "GameId:" & 用户(I).游戏ID & ";username:" & 用户(I).用户名 & ";Connectnum:" & 用户(I).连接号 & ";userstaus:" & 用户(I).用户状态 & "---->send")
Else
FrmMain.DeBugs ("user:" & I & "GameId:" & 用户(I).游戏ID & ";username:" & 用户(I).用户名 & ";Connectnum:" & 用户(I).连接号 & ";userstaus:" & 用户(I).用户状态 & "---->not send")
End If
DoEvents
Next
'///报头+1房间ID+2桌+3坐+4性别+5积分+6胜+7输+8团队+9职务+10头像+11上次LOGON时间+12昵称+13用户名+14连接号+15ip
OnlineUser = "4000$" & Hall & "$" & OnUser
End Function
浙江启扬智能科技有限公司
2023-06-12 广告
Android和ARM、Linux之间存在密切的联系。Android是一种基于Linux内核的嵌入式智能操作系统,它采用了ARM处理器作为其主要处理器架构。Android的内核和许多应用程序都是基于ARM架构编写的,包括处理器和内存管理器。... 点击进入详情页
本回答由浙江启扬智能科技有限公司提供
百度网友3c15ecd54
2006-02-13 · TA获得超过137个赞
知道小有建树答主
回答量:134
采纳率:0%
帮助的人:136万
展开全部
不需要,只要连接了你主机的人都可以收到你的广播。
直接使用winsock1.SendData Text就可以了,winsock1就是你的控件的名称,text就是一串string类型的文字。
你知道winsock的连接方法吧……不知道就无能为立了,说一下,用winsock1.Connect方法,记得主机要先进行winsock1.Listen开始侦听,记得设置好IP和端口先,太多的说不完。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友bdf3f8b0b
2006-02-08 · 超过100用户采纳过TA的回答
知道小有建树答主
回答量:513
采纳率:0%
帮助的人:319万
展开全部
向整个网进行广播就可以了(把发送的IP设成广播地址),如果不行的话就做一个循环整个网段内的IP进行发信消息(不过这样很慢)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2006-02-03
展开全部
baidu 上搜索一下不就得了有问题上百度
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
OP红发杰克
2006-02-03 · TA获得超过1427个赞
知道小有建树答主
回答量:486
采纳率:0%
帮助的人:277万
展开全部
这个,建议你去

www.vbvan.com

这个地方高手众多,可能有办法帮你解决,我实在是无能为力......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式