Я использую Erlang для кодирования битторрент-клиента. Я застрял на 4 дня с той же проблемой.
Я отправляю рукопожатие всем узлам, каждый из которых имеет свой собственный порт ip:
Я использую gen_tcp: connect для подключения.
Проблема в том, что я не могу получить их ответ. Я провел много исследований и использовал некоторые программы для мониторинга моих входящих / исходящих соединений.
Узлы получают данные и отправляют ответ обратно на порт, который я использовал для отправки им рукопожатия.
Код мудрый: get_tcp: connect выбирает порт и использует этот порт для отправки данных одноранговому узлу. Пир отвечает обратно на этот порт. Однако, как вы знаете в Erlang, вам нужно использовать gen_tcp: listen, чтобы выбрать ответное соединение, и вам нужно указать порт. В моем случае порт, который я должен прослушивать, - это порт, который вернул gen_tcp: connect.
Я могу получить этот номер порта, используя inet: port, но ошибка всегда та же: используется порт.
Я понимаю, почему я получаю ошибку, просто потому, что порт, который я пытаюсь прослушать, уже используется gen_tcp: connect. Я пытался закрыть сокет, чтобы освободить порт, но ничего.
Итак, мой вопрос: возможно ли в Erlang каким-либо образом подключиться к одноранговому узлу и отправить ему данные в порт, а затем прослушать ответ на этом же порту. Если нет, то я должен каким-то образом сказать партнеру, чтобы он отправил мне данные обратно на порт, который я выбрал.
Любые идеи от всех гуру Эрланга приветствуются.
Спасибо,
// Франк.