17.14. Writing a Multi-Homed ServerProblemYou want to write a server that knows that the machine it runs on has multiple IP addresses, and that it should possibly do different things for each address. SolutionDon't bind your server to a particular address. Instead, bind to use Socket;
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1);
bind(SERVER, sockaddr_in($server_port, INADDR_ANY))
or die "Binding: $!\n";
# accept loop
while (accept(CLIENT, SERVER)) {
$my_socket_address = getsockname(CLIENT);
($port, $myaddr) = sockaddr_in($my_socket_address);
}DiscussionWhereas If you're using IO::Socket::INET, your code will look like this: $server = IO::Socket::INET->new(LocalPort => $server_port,
Type => SOCK_STREAM,
Proto => 'tcp',
Listen => 10)
or die "Can't create server socket: $@\n";
while ($client = $server->accept()) {
$my_socket_address = $client->sockname();
($port, $myaddr) = sockaddr_in($my_socket_address);
# ...
}If you don't specify a local port to If you want your server to listen only for a particular virtual host, don't use use Socket;
$port = 4269; # port to bind to
$host = "specific.host.com"; # virtual host to listen on
socket(Server, PF_INET, SOCK_STREAM, getprotobyname("tcp"))
or die "socket: $!";
bind(Server, sockaddr_in($port, inet_aton($host)))
or die "bind: $!";
while ($client_address = accept(Client, Server)) {
# ...
}See AlsoThe
|