У меня проблема с одним из моих приложений на C++ в Windows 2008x64 (такое же приложение отлично работает в Windows 2003x64).Сокет все еще прослушивается после сбоя приложения
После сбоя или даже после регулярного цикла останова/перезапуска у него возникла проблема с использованием гнезда на порту 82, ему необходимо получить команды.
Глядя на netstat, я вижу, что сокет все еще находится в состоянии прослушивания более 10 минут после прекращения приложения (процесс определенно не работает).
TCP 0.0.0.0:82 LISTENING
Я попытался установить опцию сокета для REUSEADDR, но, насколько я знаю, что влияет только на повторное подключение к порту, которая находится в состоянии TIME_WAIT. В любом случае это изменение, похоже, не имело никакого значения.
int doReuse = 1;
setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR,
(const char *)&doReuse, sizeof(doReuse));
Любые идеи, что я могу сделать, чтобы решить или по крайней мере избежать этой проблемы?
EDIT:
ли NetStat -an, но это все, что я получаю:
TCP 0.0.0.0:82 0.0.0.0:0 LISTENING
Для NETSTAT -anb я получаю:
TCP 0.0.0.0:82 0.0.0.0:0 LISTENING
[System]
Я в курсе закрывая изящно, но даже если приложение сбой по какой-то причине, мне все равно нужно перезапустить его. В рассматриваемом приложении используется внутренняя библиотека, которая внутренне использует API Windows Sockets.
EDIT:
Видимо нет решения этой проблемы, поэтому для развития я пойду с прокси/инструмент для работы вокруг него. Спасибо за все предложения, очень ценю.
Если у вас возникли проблемы даже после перезагрузки компьютера, это может быть какая-то другая программа, использующая ваш порт. Сделайте `netstat -anb`, чтобы увидеть, кто слушает 82. – 2010-12-16 20:44:54
Это нормально после сбоя. Сокет inofrmation хранится в ОС (ваше приложение просто держит дескриптор этой информации). Когда ваше приложение аварийно завершает работу (или завершает работу без закрытия соединения), сокет останется в использовании до тех пор, пока ОС не обнаружит, что приложение для прослушивания ушло (это может быть когда-то хорошее 10 минут). Лучше всего передать в порт аргумент командной строки, чтобы вы могли быстро изменить порт во время де-бинга. – 2010-12-16 21:21:46
У вас есть сообщение об ошибке в журнале событий Windows? Возможно, с кодом 4227 ?. – 2010-12-16 21:42:21