GetValid() public static method

Checks the context for validity, throws a warning it is not.
In case the context is invalid.
public static GetValid ( PhpResource resource ) : StreamContext
resource Pchp.Core.PhpResource Resource which should contain a StreamContext.
return StreamContext
Ejemplo n.º 1
0
        /// <summary>
        /// Open client socket.
        /// </summary>
        public static PhpResource stream_socket_server(Context ctx, string localSocket, out int errno, out string errstr, SocketOptions flags, PhpResource context)
        {
            // defaults:
            errno  = 0;
            errstr = string.Empty;

            var sc = StreamContext.GetValid(context);

            if (sc == null)
            {
                return(null);
            }

            //
            int port = 0;

            if (TryParseSocketAddr(localSocket, out _, out var protocol, ref port, out var address))
            {
                try
                {
                    var socket = new Socket(address.AddressFamily, SocketType.Stream, protocol);
                    socket.Bind(new IPEndPoint(address, port));
                    //socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.MaxConnections) // Not Supported
                    socket.Listen(512); // NOTE: a default backlog should be used

                    return(new SocketStream(ctx, socket, localSocket, sc));
                }
                catch (SocketException e)
                {
                    errno  = e.ErrorCode;
                    errstr = e.Message;
                    return(null);
                }
            }
Ejemplo n.º 2
0
        /// <summary>
        /// Open client socket.
        /// </summary>
        public static PhpResource stream_socket_server(Context ctx, string localSocket, out int errno, out string errstr, SocketOptions flags, PhpResource context)
        {
            StreamContext sc = StreamContext.GetValid(context);

            if (sc == null)
            {
                errno  = -1;
                errstr = null;
                return(null);
            }

            int port = 0;

            //SplitSocketAddressPort(ref localSocket, out port);
            return(Connect(ctx, localSocket, port, out errno, out errstr, Double.NaN, flags, sc));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Open client socket.
        /// </summary>
        public static PhpResource stream_socket_client(Context ctx, string remoteSocket, out int errno, out string errstr, double timeout, SocketOptions flags, PhpResource context)
        {
            var sc = StreamContext.GetValid(context);

            if (sc != null)
            {
                //SplitSocketAddressPort(ref remoteSocket, out port);
                return(Connect(ctx, remoteSocket, 0, out errno, out errstr, timeout, flags, sc));
            }
            else
            {
                errno  = -1;
                errstr = null;
                return(null);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Open client socket.
        /// </summary>
        public static PhpResource stream_socket_server(Context ctx, string localSocket, out int errno, out string errstr, SocketOptions flags, PhpResource context)
        {
            // defaults:
            errno  = 0;
            errstr = string.Empty;

            var sc = StreamContext.GetValid(context);

            if (sc == null)
            {
                return(null);
            }

            //
            int port = 0;

            if (TryParseSocketAddr(localSocket, out _, out var protocol, ref port, out var address))
            {
                try
                {
                    var socket  = new Socket(address.AddressFamily, SocketType.Stream, protocol);
                    var backlog = 512;

                    var socket_opts = sc.GetOptions("socket");
                    if (socket_opts != null)
                    {
                        var pairenum = socket_opts.GetFastEnumerator();
                        while (pairenum.MoveNext())
                        {
                            var pair    = pairenum.Current;
                            var optname = pair.Key.String;
                            if (optname == null) // numerical option?
                            {
                                continue;
                            }

                            //if (optname.Equals("bindto", StringComparison.OrdinalIgnoreCase))
                            //{

                            //}
                            //else
                            if (optname.Equals("backlog", StringComparison.OrdinalIgnoreCase))
                            {
                                backlog = pair.Value.ToInt();
                            }
                            //else if (optname.Equals("ipv6_v6only", StringComparison.OrdinalIgnoreCase))
                            //{

                            //}
                            else if (optname.Equals("so_reuseaddr", StringComparison.OrdinalIgnoreCase))
                            {
                                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, pair.Value.ToInt());
                            }
                            //else if (optname.Equals("so_reuseport", StringComparison.OrdinalIgnoreCase))
                            //{
                            //    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReusePort)
                            //}
                            else if (optname.Equals("so_broadcast", StringComparison.OrdinalIgnoreCase))
                            {
                                socket.EnableBroadcast = pair.Value.ToBoolean();
                            }
                            else if (optname.Equals("tcp_nodelay", StringComparison.OrdinalIgnoreCase))
                            {
                                socket.NoDelay = pair.Value.ToBoolean();
                            }
                            else if (optname.Equals("tcp_keepalive", StringComparison.OrdinalIgnoreCase))
                            {
                                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, pair.Value.ToBoolean());
                            }
                            else
                            {
                                // unknown option
                                PhpException.InvalidArgument(optname, nameof(stream_socket_server));
                            }
                        }
                    }

                    socket.Bind(new IPEndPoint(address, port));
                    //socket.NoDelay = false;
                    //socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.MaxConnections) // Not Supported
                    socket.Listen(backlog); // NOTE: a default backlog should be used

                    return(new SocketStream(ctx, socket, localSocket, sc));
                }
                catch (SocketException e)
                {
                    errno  = e.ErrorCode;
                    errstr = e.Message;
                    return(null);
                }
            }