Соединение характеризуется двумя сокетами. А вот сам сокет характеризуется не двумя параметрами (ip + порт), а пятью:
ip + порт локальные
ip + порт того, кто присоединился
протокол
Пусть у нас серверная программа на компьютере с ip 192.168.0.10 слушает порт 54123.
Пусть к ней присоединяются два клиента, их ip и порт на ИХ компьютерах такие:
192.168.100.1, порт 64001
192.168.200.5, порт 62038
Тогда на сервере при образовании соединения ОС создает два сокета, каждый из которых идентифицируется вот так:
___server local ip + port___client remote ip + port___protocol
1) 192.168.0.10:54123____192.168.100.1:64001_____tcp
2) 192.168.0.10:54123____192.168.200.5:62038_____tcp
Таким образом, серверной программе с точки зрения "растраты портов" не важно, сколько народа к ней присоединяются, т.к. "своя" пара ip + порт у нее всегда одинаковая => разговор о 64k портов в данном случае не актуален.
Об ограничении в 65k портов можно говорить в случае если бы мы хотели запустить 65k серверных программ и каждой тогда понадобился бы свой порт для прослушивания. Но столько программ очень вряд ли кто-то запускает и к тому же две программы могут "разделять" один и тот же порт через мультиплексирование. Я не знаю о нем толком ничего, просто запомнилось, что такая возможность есть.
P.S. Ограничение в 65k портов связано с тем, что в TCP-слое пакета под порт выделено 16 бит.