C# で udp 送受信 unity3d プラグイン dll を作成しましたが、iphone4s のサーバーから udp パケットを受信できません。
サーバーが iphone4s で実行されているデモに udp パケットを送信すると、何も受信できません。
サーバーが ipod touch 4 で実行されているデモに udp パケットを送信すると、動作します!パケットを受信しました!
サーバーが Unity3d エディターで実行されているデモに udp パケットを送信すると、問題なく動作します!
クライアントとサーバー間のパケットをキャプチャするために Wireshark を使用しました。実際にサーバーがデモに送信したパケットをキャプチャしましたが、クライアントのデモは何も受信していないようです。
なんで?
internal class RudpNetInteractor
{
private Socket socket;
private EndPoint serverAddress;
internal RudpNetInteractor(IPEndPoint serverAddress)
{
this.rudpClient = rudpClient;
this.serverAddress = serverAddress;
}
internal void BuildConnection()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Connect(serverAddress);
BeginReceive();
}
internal void Send(byte[] buffer)
{
socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
}
private void OnSend(IAsyncResult ar)
{
try
{
socket.EndSend(ar);
}
catch {}
}
internal void Destroy()
{
socket.Close();
socket = null;
}
private void OnReceive(IAsyncResult ar)
{
try
{
SocketReceiveInfo receiveInfo = (SocketReceiveInfo)ar.AsyncState;
Socket receiveSocket = receiveInfo.ReceiveSocket;
int len = receiveSocket.EndReceive(ar);
if (len > 0)
{
byte[] dest = new byte[len];
Array.Copy(receiveInfo.ReceiveBytes, dest, len);
Console.WriteLine(BitConverter.ToString(dest));
}
BeginReceive();
}
catch {}
}
private void BeginReceive()
{
byte[] receiveBytes = new byte[576];
SocketReceiveInfo info = new SocketReceiveInfo(receiveBytes, socket);
socket.BeginReceiveFrom(receiveBytes, 0, receiveBytes.Length, SocketFlags.None, ref serverAddress, new AsyncCallback(OnReceive), info);
}
}
internal class SocketReceiveInfo
{
private byte[] receiveBytes;
private Socket receiveSocket;
internal SocketReceiveInfo(byte[] receiveBytes, Socket receiveSocket)
{
this.receiveBytes = receiveBytes;
this.receiveSocket = receiveSocket;
}
internal byte[] ReceiveBytes
{
get { return receiveBytes; }
}
internal Socket ReceiveSocket
{
get { return receiveSocket; }
}
}