UDPブロードキャストとマルチキャスティングについての私の理解は非常に限定されていると言います。これが私の最初のプロジェクトです。UDPクライアントからのUDPマルチキャストへの対応方法
私はC#デスクトップクライアントをマシンとWindows phone 7アプリケーションで実行しています。 WP7アプリケーションは、ネットワーク経由でUDPブロードキャストを送信することになっており、デスクトップクライアントはUDPマルチキャストをリッスンし、それに従って応答することになっています。これは、デスクトップクライアントを実行しているマシンを見つけるために、ネットワーク上の単純なマシンディスカバリを意味します。
C#デスクトップクライアントコード
public class ConnectionListener
{
private const int UDP_PORT = 54322;
private static readonly IPAddress MULTICAST_GROUP_ADDRESS = IPAddress.Parse("224.0.0.1");
private UdpClient _listener;
public ConnectionListener()
{
_listener = new UdpClient(UDP_PORT, AddressFamily.InterNetwork);
_listener.EnableBroadcast = true;
_listener.JoinMulticastGroup(MULTICAST_GROUP_ADDRESS);
_listener.BeginReceive(ReceiveCallback, null);
}
private void ReceiveCallback(IAsyncResult result)
{
IPEndPoint receiveEndpoint = new IPEndPoint(IPAddress.Any, UDP_PORT);
byte[] receivedBytes = _listener.EndReceive(result, ref receiveEndpoint);
byte[] response = Encoding.UTF8.GetBytes("WPF Response");
_listener.BeginSend(response, response.Length, receiveEndpoint, SendCallback, null);
}
private void SendCallback(IAsyncResult result)
{
int sendCount = _listener.EndSend(result);
Console.WriteLine("Sent Count is: " + sendCount);
}
}
WP7 Serverコード:
public class MachineDetector
{
public const int UDP_PORT = 54322;
private const string MULTICAST_GROUP_ADDRESS = "224.0.0.1";
UdpAnySourceMulticastClient _client = null;
bool _joined = false;
private byte[] _receiveBuffer;
private const int MAX_MESSAGE_SIZE = 512;
public MachineDetector()
{
_client = new UdpAnySourceMulticastClient(IPAddress.Parse(MULTICAST_GROUP_ADDRESS), UDP_PORT);
_receiveBuffer = new byte[MAX_MESSAGE_SIZE];
_client.BeginJoinGroup(
result =>
{
_client.EndJoinGroup(result);
_client.MulticastLoopback = false;
SendRequest();
}, null);
}
private void SendRequest()
{
byte[] requestData = Encoding.UTF8.GetBytes("WP7 Multicast");
_client.BeginSendToGroup(requestData, 0, requestData.Length,
result =>
{
_client.EndSendToGroup(result);
Receive();
}, null);
}
private void Receive()
{
Array.Clear(_receiveBuffer, 0, _receiveBuffer.Length);
_client.BeginReceiveFromGroup(_receiveBuffer, 0, _receiveBuffer.Length,
result =>
{
IPEndPoint source;
_client.EndReceiveFromGroup(result, out source);
string dataReceived = Encoding.UTF8.GetString(_receiveBuffer, 0, _receiveBuffer.Length);
string message = String.Format("[{0}]: {1}", source.Address.ToString(), dataReceived);
Console.WriteLine(message);
Receive();
}, null);
}
}
私はデスクトップクライアントでデータを受信することができていますが、WP7アプリが受信できていないようです応答。私はしばらくの間、これについて私の頭を叩いていたし、他にどこを見なければわからない。どんな助けも素晴らしいだろう。
WP7アプリが応答を受信しない理由は何ですか?
@AlRodriguezあなたの権利。 [MSDN](http://msdn.microsoft.com/en-us/library/dx13cwba.aspx)では、 'BeginSend'について、'接続先の呼び出しによって先を先に指定する 'ことについて述べています。しかし、マルチキャストされたデータグラムを受信しようとするなら、Connectメソッドを呼ばないでください。 – user1055604