There are two ways of doing this:
- fork() after you accept(), which gets you one child per connection, or
- threads - create multiple worker threads and pass the file descriptor in.
Since a socket isn't really a shared resource, there are restrictions on how you can connect multiple ends to it. A socket is just a file descriptor, and a process can't get access to another processes's FDs (unless it has root privileges). When you fork, the child process already has the filehandle open, and can use it without any problems, but since you can't get any further access to the parent, where the accept()s are going on, you have to die once you're finished with the current client.
Threads however, all live in the same PID, they just each have their own copy of the perl runtime. They can get at the parent's FDs by passing the file descriptor number around, which you get by running fileno($socket).
I posted a thread a couple of months ago here, which ended up with some really helpful example code from BrowserUk: Resource pools and concurrency