/// <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); } }
/// <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)); }
/// <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); } }
/// <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); } }