2009-03-11 13 views
4

私はに簡単なメッセージを公開しています。。*。255(私のipの最後の部分を255に変更)と私はそれを聞こうとしています。コードはエラーを返さないが、何も受け取っていない。 wiresharkでは、私はブローカーが正しく送信されていることがわかりますが、毎回別のポートを使用しています(これは大きな問題かどうかわかりません)。ここに私のコードのいくつかの部分があります。スレッドでUDPブロードキャストを聞く

Private Sub connect() 
    setip() 
    btnsend.Enabled = True 
    btndisconnect.Enabled = True 
    btnconnect.Enabled = False 
    receive() 
    txtmsg.Enabled = True 
End Sub 

Sub receive() 
    Try 
     SocketNO = port 
     rClient = New System.Net.Sockets.UdpClient(SocketNO) 
     rClient.EnableBroadcast = True 
     ThreadReceive = _ 
      New System.Threading.Thread(AddressOf receivemessages) 
     If ThreadReceive.IsAlive = False Then 
      ThreadReceive.Start() 
     Else 
      ThreadReceive.Resume() 
     End If 
    Catch ex As Exception 
     MsgBox("Error") 
    End Try 
End Sub 

Sub receivemessages() 
    Dim receiveBytes As Byte() = rClient.Receive(rip) 
    Dim BitDet As BitArray 
    BitDet = New BitArray(receiveBytes) 
    Dim strReturnData As String = _ 
       System.Text.Encoding.Unicode.GetString(receiveBytes) 
    MsgBox(strReturnData.ToString) 
End Sub 

Private Sub setip() 
    hostname = System.Net.Dns.GetHostName 
    myip = IPAddress.Parse(System.Net.Dns.GetHostEntry(hostname).AddressList(1).ToString) 
    ipsplit = myip.ToString.Split(".".ToCharArray()) 
    ipsplit(3) = 255 
    broadcastip = IPAddress.Parse(ipsplit(0) & "." & ipsplit(1) & "." + ipsplit(2) + "." + ipsplit(3)) 
    iep = New IPEndPoint(broadcastip, port) 

End Sub 

Sub sendmsg() 
    Dim msg As Byte() 
    MsgBox(myip.ToString) 
    sclient = New UdpClient 
    sclient.EnableBroadcast = True 
    msg = Encoding.ASCII.GetBytes(txtmsg.Text) 
    sclient.Send(msg, msg.Length, iep) 
    sclient.Close() 
    txtmsg.Clear() 
End Sub 
+0

を受け取るには0.255が、それはネットマスクIPの補数とIP論理和であるべき正しいブロードキャストアドレスではないことも可能です。ほとんどのシステムは255.255.255.255のグローバルブロードキャストを使用しています。また、ブロードキャストは通常​​はルーティングされず、ゲートウェイやルータ経由でブロードキャストされません。 –

答えて

3

This articleあなたが何をしようとしてほぼ正確にやっているように見えるし、コード内のコメントの多くとかなりよくそれを説明しています。

1

UDPポートを受信するには、ポートをバインドする必要があります。ここで私が使用するいくつかのC#のコードです。メッセージのソケットをポーリングする受信スレッドを使用します。 〜NM |

Socket soUdp_msg = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); 
IPEndPoint localIpEndPoint_msg = new IPEndPoint(IPAddress.Any, UdpPort_msg); 
soUdp_msg.Bind(localIpEndPoint_msg); 

はその後、私のスレッド

byte[] received_s = new byte[2048]; 
IPEndPoint tmpIpEndPoint = new IPEndPoint(IPAddress.Any, UdpPort_msg); 
EndPoint remoteEP = (tmpIpEndPoint); 

while (soUdp_msg.Poll(0, SelectMode.SelectRead)) 
{ 

    int sz = soUdp_msg.ReceiveFrom(received_s, ref remoteEP); 
    tep = (IPEndPoint)remoteEP; 

    // do some work 
} 

Thread.Sleep(50); // sleep so receive thread does not dominate computer 
+0

SocketNOがInt32であると仮定すると、System.Net.Sockets.UdpClient(SocketNO)はポートをIPAddress.Anyにバインドします – Dave

関連する問題