MulticastLoopback多播 环回

mania001 2007-06-06 03:52:50
兄弟我想在win 4.2 或者5.0下实现多播。要求socket属性设定自己发的消息自己不收的目的。于是起用了Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, 0)这句话。在ce下运行会报参数无效或不支持。且如果在xp下我能实现我的目的(自己发的自己不收)。但在ce下加上这句话就报错。如果我屏蔽掉这句话。用TextBox3.Text = Socket.GetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback)的话发现TextBox3.Text 显示为0。但在xp下显示为1 (同样没有Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, 0)这句话)
请教高手。我该怎么样实现在ce下自己发的消息自己不收呀。谢谢。

急!
...全文
471 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
snto 2007-06-06
  • 打赏
  • 举报
回复
Imports System.Runtime.InteropServices

Namespace My

Partial Class MyComputer

Public Function StructToBytes(ByVal structObj As Object) As Byte()
Dim size As Integer = Marshal.SizeOf(structObj)
Dim buffer As IntPtr = Marshal.AllocHGlobal(size)
Try
Marshal.StructureToPtr(structObj, buffer, False)
Dim bytes As Byte() = New Byte(size - 1) {}
Marshal.Copy(buffer, bytes, 0, size)
Return bytes
Finally
Marshal.FreeHGlobal(buffer)
End Try
End Function

Public Function BytesToStruct(ByVal bytes As Byte(), ByVal strcutType As Type) As Object
Dim size As Integer = Marshal.SizeOf(strcutType)
Dim buffer As IntPtr = Marshal.AllocHGlobal(size)
Try
Marshal.Copy(bytes, 0, buffer, size)
Return Marshal.PtrToStructure(buffer, strcutType)
Finally
Marshal.FreeHGlobal(buffer)
End Try
End Function

End Class
End Namespace



Imports System.Text
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Public Class Server
Private SendBuf As Byte()
Private ReceiveBuf As Byte()
Private IServer As UdpClient
Private TServer As Thread
Private TServerJoin As Thread
Private GroupEP As IPEndPoint
Private RemoteEP As IPEndPoint
Private SendInfo As SendStruc

Public Event ReceiveMessage As System.EventHandler

Public Sub BroadCast(ByVal SendType As String, ByVal imessage As String)
SendInfo.Command = SendType
SendInfo.Value = imessage
SendBuf = My.Computer.StructToBytes(SendInfo)
IServer.Send(SendBuf, SendBuf.Length, GroupEP)
End Sub

Public Sub New()
GroupEP = New IPEndPoint(IPAddress.Parse("239.1.1.3"), 10000)
IServer = New UdpClient(GroupEP.Port)
IServer.JoinMulticastGroup(GroupEP.Address)
TServer = New Thread(AddressOf ServerListener)
TServer.Start()
TServerJoin = New Thread(AddressOf WaitingForListener)
TServerJoin.Start()
End Sub

Private Sub ServerListener()
Dim ReceiveInfo As New SendStruc(True)
Dim ReceiveMessage As String = ""
Do
Try
ReceiveBuf = IServer.Receive(RemoteEP)
ReceiveInfo = My.Computer.BytesToStruct(ReceiveBuf, ReceiveInfo.GetType)
If ReceiveInfo.Value = "" Then ReceiveInfo.Value = "(空消息)"
If ReceiveInfo.Command = "JoinServer" Then
ReceiveMessage = ReceiveInfo.Value
TServerJoin.Abort()
ElseIf ReceiveInfo.Command = "Send" Then
ReceiveMessage = "收到来自" & RemoteEP.ToString & "的信息:" & ReceiveInfo.Value
End If
RaiseEvent ReceiveMessage(ReceiveMessage, New System.EventArgs)
Catch ex As Exception

End Try
Loop

End Sub

Private Sub WaitingForListener()
Thread.Sleep(100)
BroadCast("JoinServer", GetLocalIP() & ":" & GroupEP.Port & "加入组播!")
End Sub

Public Sub Close()

BroadCast("JoinServer", GetLocalIP() & ":" & GroupEP.Port & "退出组播!")
IServer.DropMulticastGroup(GroupEP.Address)
IServer.Close()
TServer.Abort()
End Sub

Private Function GetLocalIP() As String
Dim addr As System.Net.IPAddress
addr = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName())(0)
Return addr.ToString
End Function

Private Structure SendStruc

Public Sub New(ByVal InitMe As Boolean)
If InitMe Then
Command = ""
Value = ""
End If
End Sub

Public Command As String
Public Value As String
End Structure
End Class


Public Class Form1

Private WithEvents MyServer As New Server
Private Delegate Sub InvokeDelegate()
Private ReceiveMessage As String

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
MyServer.Close()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MyServer.BroadCast("Send", TextBox1.Text)
End Sub

Private Sub Receive(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyServer.ReceiveMessage
ReceiveMessage = sender.ToString
TextBox2.BeginInvoke(New InvokeDelegate(AddressOf ReceiveInvoke))
End Sub

Private Sub ReceiveInvoke()
TextBox2.AppendText(ReceiveMessage & vbCrLf)
End Sub


End Class
snto 2007-06-06
  • 打赏
  • 举报
回复
有点乱,没看明白,用udpclient,另外用封装好的udpclient不可以吗?ce程序没开发过,不知道怎么写,多播(组播)是要路由器或3层交换机支持的,有局限性,广播服务端然后写c/s模式的感觉好些
magicbacon 2007-06-06
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20040201/13/2692395.html

不懂,找到这个不知道对您有没有一点帮助。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧