public __UdpClient(xConstructorArguments args) { //Console.WriteLine("enter __UdpClient ctor"); // http://stackoverflow.com/questions/8558791/multicastsocket-vs-datagramsocket-in-broadcasting-to-multiple-clients // you must use MulticastSocket for receiving the multicasts; for sending them, again, you can use either DatagramSocket or MulticastSocket, and there is no difference in efficiency. //var buffer = new sbyte[0x10000]; // X:\jsc.svn\market\synergy\javascript\chrome\chrome\BCLImplementation\System\Net\Sockets\UdpClient.cs //var buffer = new sbyte[0x1000]; var buffer = new sbyte[MaxData]; //E/dalvikvm-heap(14366): Out of memory on a 1048592-byte allocation. //I/dalvikvm(14366): "Thread-4310" prio=5 tid=827 RUNNABLE // tested by // X:\jsc.svn\examples\java\android\vr\OVRMyCubeWorldNDK\OVRMyCubeWorld\ApplicationActivity.cs #region vJoinMulticastGroup this.vJoinMulticastGroup = (IPAddress multicastAddr, IPAddress localAddress) => { // http://developer.android.com/reference/java/net/InetSocketAddress.html // http://developer.android.com/reference/java/net/SocketAddress.html Console.WriteLine("enter vJoinMulticastGroup"); // at this point we have to jump back in time and get a multicast socket. __IPAddress __multicastAddr = multicastAddr; __IPAddress __localAddress = localAddress; __NetworkInterface nic = __localAddress.InternalNetworkInterface; // X:\jsc.svn\examples\java\android\LANBroadcastListener\LANBroadcastListener\ApplicationActivity.cs // X:\jsc.svn\examples\java\android\forms\FormsUDPJoinGroup\FormsUDPJoinGroup\ApplicationControl.cs try { args.xMulticastSocket.joinGroup( new java.net.InetSocketAddress( __multicastAddr.InternalAddress, args.port ), nic ); } catch { throw; } }; #endregion #region vReceiveAsync this.vReceiveAsync = delegate { var c = new TaskCompletionSource<__UdpReceiveResult>(); __Task.Run( delegate { // http://stackoverflow.com/questions/10808512/datagrampacket-equivalent // http://tutorials.jenkov.com/java-networking/udp-datagram-sockets.html // tested by? var packet = new java.net.DatagramPacket(buffer, buffer.Length); try { args.xDatagramSocket.receive(packet); var xbuffer = new byte[packet.getLength()]; Array.Copy( buffer, xbuffer, xbuffer.Length ); var x = new __UdpReceiveResult( buffer: xbuffer, remoteEndPoint: new __IPEndPoint( new __IPAddress { InternalAddress = packet.getAddress() }, port: packet.getPort() ) ); c.SetResult(x); } catch { // fault? } } ); return c.Task; }; #endregion //Console.WriteLine("enter __UdpClient before this.Client"); this.Client = new __Socket { #region vBind vBind = (EndPoint localEP) => { // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150721/ovroculus360photoshud try { Console.WriteLine("enter __UdpClient vBind " + new { args.xDatagramSocket, localEP }); var v4 = localEP as IPEndPoint; if (v4 != null) { __IPAddress v4a = v4.Address; // http://developer.android.com/reference/java/net/InetSocketAddress.html var x = new java.net.InetSocketAddress(v4a.InternalAddress, v4.Port); Console.WriteLine("before __UdpClient vBind " + new { v4a.InternalAddress, v4.Port }); // Z:\jsc.svn\examples\java\android\vr\OVRWindWheelNDK\UDPWindWheel\Program.cs // is this the first bind? if (args.xDatagramSocket == null) { var xDatagramSocket = new java.net.DatagramSocket(v4.Port); args.vDatagramSocket = () => xDatagramSocket; } else { args.xDatagramSocket.bind(x); } } } catch (Exception err) { Console.WriteLine("err __UdpClient vBind " + new { err.Message, err.StackTrace }); //throw; throw new InvalidOperationException(); } } #endregion }; //Console.WriteLine("enter __UdpClient after this.Client " + new { this.Client }); #region vSend this.vSend = (byte[] datagram, int bytes, string hostname, int port) => { //I/System.Console(22987): 59cb:0001 about to Send //I/System.Console(22987): 59cb:0001 enter __UdpClient vSend //I/System.Console(22987): 59cb:0001 err __UdpClient vSend { Message = , StackTrace = android.os.NetworkOnMainThreadException //I/System.Console(22987): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) //I/System.Console(22987): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:276) //I/System.Console(22987): at libcore.io.IoBridge.sendto(IoBridge.java:513) //I/System.Console(22987): at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184) //I/System.Console(22987): at java.net.DatagramSocket.send(DatagramSocket.java:305) //I/System.Console(22987): at ScriptCoreLibJava.BCLImplementation.System.Net.Sockets.__UdpClient___c__DisplayClass12.__ctor_b__6(__UdpClient___c__DisplayClass12.java:109) var t = this.vSendAsync(datagram, bytes, hostname, port); return t.Result; }; #endregion #region vSendAsync this.vSendAsync = (byte[] datagram, int bytes, string hostname, int port) => { var c = new TaskCompletionSource<int>(); __Task.Run( delegate { try { var a = global::java.net.InetAddress.getByName(hostname); var packet = new java.net.DatagramPacket( (sbyte[])(object)datagram, bytes, a, port ); args.xDatagramSocket.send(packet); // retval tested? c.SetResult( packet.getLength() ); } catch { throw; } } ); return c.Task; }; #endregion #region vSendAsync2 this.vSendAsync2 = (byte[] datagram, int bytes, IPEndPoint endPoint) => { var c = new TaskCompletionSource<int>(); __Task.Run( delegate { try { var packet = new java.net.DatagramPacket( (sbyte[])(object)datagram, bytes, (__IPAddress)endPoint.Address, endPoint.Port ); args.xDatagramSocket.send(packet); // retval tested? c.SetResult( packet.getLength() ); } catch { throw; } } ); return c.Task; }; #endregion #region vClose this.vClose = delegate { try { args.xDatagramSocket.close(); } catch { } }; #endregion }
public __UdpClient(xConstructorArguments args) { //Console.WriteLine("enter __UdpClient ctor"); // http://stackoverflow.com/questions/8558791/multicastsocket-vs-datagramsocket-in-broadcasting-to-multiple-clients // you must use MulticastSocket for receiving the multicasts; for sending them, again, you can use either DatagramSocket or MulticastSocket, and there is no difference in efficiency. //var buffer = new sbyte[0x10000]; // X:\jsc.svn\market\synergy\javascript\chrome\chrome\BCLImplementation\System\Net\Sockets\UdpClient.cs //var buffer = new sbyte[0x1000]; var buffer = new sbyte[MaxData]; //E/dalvikvm-heap(14366): Out of memory on a 1048592-byte allocation. //I/dalvikvm(14366): "Thread-4310" prio=5 tid=827 RUNNABLE // tested by // X:\jsc.svn\examples\java\android\vr\OVRMyCubeWorldNDK\OVRMyCubeWorld\ApplicationActivity.cs #region vJoinMulticastGroup this.vJoinMulticastGroup = (IPAddress multicastAddr, IPAddress localAddress) => { // http://developer.android.com/reference/java/net/InetSocketAddress.html // http://developer.android.com/reference/java/net/SocketAddress.html Console.WriteLine("enter vJoinMulticastGroup"); // at this point we have to jump back in time and get a multicast socket. __IPAddress __multicastAddr = multicastAddr; __IPAddress __localAddress = localAddress; __NetworkInterface nic = __localAddress.InternalNetworkInterface; // X:\jsc.svn\examples\java\android\LANBroadcastListener\LANBroadcastListener\ApplicationActivity.cs // X:\jsc.svn\examples\java\android\forms\FormsUDPJoinGroup\FormsUDPJoinGroup\ApplicationControl.cs try { args.xMulticastSocket.joinGroup( new java.net.InetSocketAddress( __multicastAddr.InternalAddress, args.port ), nic ); } catch { throw; } }; #endregion #region vReceiveAsync this.vReceiveAsync = delegate { var c = new TaskCompletionSource <__UdpReceiveResult>(); __Task.Run( delegate { // http://stackoverflow.com/questions/10808512/datagrampacket-equivalent // http://tutorials.jenkov.com/java-networking/udp-datagram-sockets.html // tested by? var packet = new java.net.DatagramPacket(buffer, buffer.Length); try { args.xDatagramSocket.receive(packet); var xbuffer = new byte[packet.getLength()]; Array.Copy( buffer, xbuffer, xbuffer.Length ); var x = new __UdpReceiveResult( buffer: xbuffer, remoteEndPoint: new __IPEndPoint( new __IPAddress { InternalAddress = packet.getAddress() }, port: packet.getPort() ) ); c.SetResult(x); } catch { // fault? } } ); return(c.Task); }; #endregion //Console.WriteLine("enter __UdpClient before this.Client"); this.Client = new __Socket { #region vBind vBind = (EndPoint localEP) => { // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150721/ovroculus360photoshud try { Console.WriteLine("enter __UdpClient vBind " + new { args.xDatagramSocket, localEP }); var v4 = localEP as IPEndPoint; if (v4 != null) { __IPAddress v4a = v4.Address; // http://developer.android.com/reference/java/net/InetSocketAddress.html var x = new java.net.InetSocketAddress(v4a.InternalAddress, v4.Port); Console.WriteLine("before __UdpClient vBind " + new { v4a.InternalAddress, v4.Port }); // Z:\jsc.svn\examples\java\android\vr\OVRWindWheelNDK\UDPWindWheel\Program.cs // is this the first bind? if (args.xDatagramSocket == null) { var xDatagramSocket = new java.net.DatagramSocket(v4.Port); args.vDatagramSocket = () => xDatagramSocket; } else { args.xDatagramSocket.bind(x); } } } catch (Exception err) { Console.WriteLine("err __UdpClient vBind " + new { err.Message, err.StackTrace }); //throw; throw new InvalidOperationException(); } } #endregion }; //Console.WriteLine("enter __UdpClient after this.Client " + new { this.Client }); #region vSend this.vSend = (byte[] datagram, int bytes, string hostname, int port) => { //I/System.Console(22987): 59cb:0001 about to Send //I/System.Console(22987): 59cb:0001 enter __UdpClient vSend //I/System.Console(22987): 59cb:0001 err __UdpClient vSend { Message = , StackTrace = android.os.NetworkOnMainThreadException //I/System.Console(22987): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) //I/System.Console(22987): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:276) //I/System.Console(22987): at libcore.io.IoBridge.sendto(IoBridge.java:513) //I/System.Console(22987): at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184) //I/System.Console(22987): at java.net.DatagramSocket.send(DatagramSocket.java:305) //I/System.Console(22987): at ScriptCoreLibJava.BCLImplementation.System.Net.Sockets.__UdpClient___c__DisplayClass12.__ctor_b__6(__UdpClient___c__DisplayClass12.java:109) var t = this.vSendAsync(datagram, bytes, hostname, port); return(t.Result); }; #endregion #region vSendAsync this.vSendAsync = (byte[] datagram, int bytes, string hostname, int port) => { var c = new TaskCompletionSource <int>(); __Task.Run( delegate { try { var a = global::java.net.InetAddress.getByName(hostname); var packet = new java.net.DatagramPacket( (sbyte[])(object)datagram, bytes, a, port ); args.xDatagramSocket.send(packet); // retval tested? c.SetResult( packet.getLength() ); } catch { throw; } } ); return(c.Task); }; #endregion #region vSendAsync2 this.vSendAsync2 = (byte[] datagram, int bytes, IPEndPoint endPoint) => { var c = new TaskCompletionSource <int>(); __Task.Run( delegate { try { var packet = new java.net.DatagramPacket( (sbyte[])(object)datagram, bytes, (__IPAddress)endPoint.Address, endPoint.Port ); args.xDatagramSocket.send(packet); // retval tested? c.SetResult( packet.getLength() ); } catch { throw; } } ); return(c.Task); }; #endregion #region vClose this.vClose = delegate { try { args.xDatagramSocket.close(); } catch { } }; #endregion }