Пассивная розетка IOLib выбрасывает EADDRINUSE - PullRequest
1 голос
/ 28 декабря 2011

IOLib позволяет создать пассивный сокет для прослушивания соединения клиентов, прежде чем вызывать listen, нам нужно вызвать (bind-address) для привязки сокета к указанному адресу / порту.

Ну, проблема в том, что когда я в первый раз связываю сокет с портом, он работает нормально, затем я использую Cc Cc в слизи, чтобы завершить поток, и снова запускаю программу, на этот раз она выдает исключение EADDRINUSE :

 <SOCKET-ADDRESS-IN-USE-ERROR 98 :EADDRINUSE "address already in use", FD: 10>

Я уже установил опцию reuse_addr для привязки адреса:

   (bind-address socket
                 +ipv4-unspecified+
                 :port 1080
                 :reuse-addr t)

Но я не думаю, что это проблема, потому что, когда я сделал то же самое в C, я использую Ctrl + C, чтобы завершить процесс, я могу повторно привязать порт, но в slime единственное решение - перезапустить Emacs, это действительно не удобно, так как я могу решить эту проблему, спасибо.

1 Ответ

1 голос
/ 13 февраля 2012

Когда вы выходите из процесса, все открытые файловые дескрипторы (включая сетевые сокеты) закрываются, поэтому кажется, что он работает в C, но не в CL. Однако, когда поток завершается, этого не происходит. Вы обнаружите, что получите нужное поведение с помощью команды restart-inferior-lisp в SLIME.

Однако не все потеряно. Если вы оберните функцию в потоке в форму UNWIND-PROTECT, вы можете организовать закрытие сокета при выходе из функции.

...