Код A и код B могут быть запущены одновременно. Я думал, что это должно выдать ошибку «Адрес уже используется», когда запускается последний процесс, который связывается с тем же портом TCP с прежним процессом.
В этой ситуации адреса не конфликтуют, только порты. Более конкретно, если исходные порты были одинаковыми. Порты назначения обычно одинаковы, так как это определяет, где может существовать служба.
Пример: http-серверы обычно используют исходный порт 80 с портами назначения "рандомизированными". Клиенты http обычно используют порт назначения 80 с портами источника "рандомизированными" (Не совсем случайно, но это выходит за рамки вопроса.)
когда код А и код С работали одновременно, я посетил "http://localhost:8008" через Google Chrome, затем код С напечатал сообщения HTTP, а код А - нет.
Это утверждение, в частности, заставляет меня поверить, что приведенный выше код на самом деле не был запущен. Конкретно эта строка:
s = TCPServer.new ("localhost", 8080)
Это объяснит большинство проблем, которые вы описываете. Попробуйте поместить каждый из них в файлы и запустить их. Вы уменьшите вероятность опечаток от одного пробега к следующему.
Единственная нерешенная проблема - этот парень:
Два (возможно, более двух) экземпляра кода C могут быть запущены одновременно, в то время как я не могу запустить два экземпляра кода A.
Попробуйте запустить lsof -Pni: 8080 (или что-то подобное в вашей среде), чтобы увидеть, какие службы прослушивают этот порт.
Кажется, есть проблема с двойным стеком со скриптом Ruby. По умолчанию используется локальный хост IPv6, затем локальный сайт IPv6 и, наконец, локальный хост IPv4. Похоже, что он указывает адрес источника внутри.
Perl-скрипт работает правильно. Вероятно, он открывает сокет с in6addr_any и комфортно слушает на v4 и v6.