listen.c revision 17d97722160b111d00f5bece8a6a40fd24aa978d
6044N/A/* Licensed to the Apache Software Foundation (ASF) under one or more 6044N/A * contributor license agreements. See the NOTICE file distributed with 6044N/A * this work for additional information regarding copyright ownership. 6044N/A * The ASF licenses this file to You under the Apache License, Version 2.0 6044N/A * (the "License"); you may not use this file except in compliance with 6044N/A * the License. You may obtain a copy of the License at 6044N/A * Unless required by applicable law or agreed to in writing, software 6044N/A * distributed under the License is distributed on an "AS IS" BASIS, 6044N/A * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 6044N/A * See the License for the specific language governing permissions and 6044N/A * limitations under the License. 6044N/A/* we know core's module_index is 0 */ 6044N/A/* TODO: make_sock is just begging and screaming for APR abstraction */ "make_sock: for address %pI, apr_socket_opt_set: (SO_REUSEADDR)",
"make_sock: for address %pI, apr_socket_opt_set: (SO_KEEPALIVE)",
"make_sock: for address %pI, apr_socket_opt_set: " * To send data over high bandwidth-delay connections at full * speed we must force the TCP window to open wide enough to keep the * pipe full. The default window size on many systems * is only 4kB. Cross-country WAN connections of 100ms * at 1Mb/s are not impossible for well connected sites. * If we assume 100ms cross-country latency, * a 4kB buffer limits throughput to 40kB/s. * To avoid this problem I've added the SendBufferSize directive * to allow the web master to configure send buffer size. * The trade-off of larger buffers is that more kernel memory * is consumed. YMMV, know your customers and your network! * -John Heidemann <johnh@isi.edu> 25-Oct-96 * If no size is specified, use the kernel default. "make_sock: failed to set SendBufferSize for " "address %pI, using default",
"make_sock: failed to set ReceiveBufferSize for " "address %pI, using default",
"make_sock: could not bind to address %pI",
"make_sock: unable to listen for connections " /* I seriously doubt that this would work on Unix; I have doubts that * it entirely solves the problem on Win32. However, since setting * reuseaddr on the listener -prior- to binding the socket has allowed * us to attach to the same port as an already running instance of * Apache, or even another web server, we cannot identify that this * port was exclusively granted to this instance of Apache. * So set reuseaddr, but do not attempt to do so until we have the * parent listeners successfully bound. "make_sock: for address %pI, apr_socket_opt_set: (SO_REUSEADDR)",
"Failed to enable the '%s' Accept Filter",
"Failed to enable APR_TCP_DEFER_ACCEPT");
/* see if we've got an old listener for this address:port */ /* Some listeners are not real so they will not have a bind_addr. */ /* If both ports are equivalent, then if their names are equivalent, * then we will re-use the existing record. return "Cannot define a slave on the same IP:port as a Listener";
"alloc_listener: failed to set up sockaddr for %s",
return "Listen setup failed";
/* Initialize to our last configured ap_listener. */ /* this has to survive restarts */ /* Go to the next sockaddr. */ /* What could happen is that we got an IPv6 address, but this system * doesn't actually support IPv6. Try the next address. "alloc_listener: failed to get a socket for %s",
return "Listen setup failed";
/* We need to preserve the order returned by getaddrinfo() */ /* Evaluates to true if the (apr_sockaddr_t *) addr argument is the * IPv4 match-any-address, 0.0.0.0. */ /* Evaluates to true if the (apr_sockaddr_t *) addr argument is the * IPv6 match-any-address, [::]. */ * Create, open, listen, and bind all sockets. * @param process The process record for the currently running server * @return The number of open sockets /* Don't allocate a default listener. If we need to listen to a * port, then the user needs to have a Listen directive in their /* If we have the unspecified IPv4 address (0.0.0.0) and * the unspecified IPv6 address (::) is next, we need to * swap the order of these in the list. We always try to * bind to IPv6 first, then IPv4, since an IPv6 socket * might be able to receive IPv4 packets if V6ONLY is not * enabled, but never the other way around. * Note: In some configurations, the unspecified IPv6 address * could be even later in the list. This logic only corrects * the situation where it is next in the list, such as when * apr_sockaddr_info_get() returns an IPv4 and an IPv6 address, /* Exchange lr and lr->next */ /* If we are trying to bind to 0.0.0.0 and a previous listener * was :: on the same port and in turn that socket does not have * the IPV6_V6ONLY flag set; we must skip the current attempt to * listen (which would generate an error). IPv4 will be handled * on the established IPv6 socket. /* Remove the current listener from the list */ lr =
previous;
/* maintain current value of previous after * post-loop expression is evaluated /* If we tried to bind to ::, and the next listener is * on 0.0.0.0 with the same port, don't give a fatal * error. The user will still get a warning from make_sock /* Remove the current listener from the list */ /* Although we've removed ourselves from the list, * we need to make sure that the next iteration won't * consider "previous" a working IPv6 '::' socket. * Changing the family is enough to make sure the * conditions before make_sock() fail. /* close the old listeners */ /* if multiple listening sockets, make them non-blocking so that * if select()/poll() reports readability for a reset connection that * is already forgotten about by the time we call accept, we won't * be hung until another connection arrives on that port "unable to control socket non-blocking status");
#
endif /* AP_NONBLOCK_WHEN_MULTI_LISTEN */ /* we come through here on both passes of the open logs phase * only register the cleanup once... otherwise we try to close * listening sockets twice when cleaning up prior to exec /* No protocol was set for this vhost, * use the default for this listener. /* TODO: set protocol defaults per-Port, eg 25=smtp */ return "Listen requires 1 or 2 arguments.";
return "Invalid address or port";
/* XXX scope id support is useful with link-local IPv6 addresses */ return "Scope id is not supported";
return "Port must be specified";
return "ListenBacklog must be > 0";
return "SendBufferSize must be >= 512 bytes, or 0 for system default.";
return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default.";