1

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; }
    }
}
4

0 に答える 0