2013-04-24 2 views
1

У меня есть чат-приложение, разработанное в vb.net. Он используется для общения между ПК, которые подключены в локальной сети внутри офиса. Он использует порт TCP/IP 25025 для подключения к другому. Приложение работает нормально. Но в некоторых случаях получатель не получит сообщение чата.Проверка состояния TCP-порта для приложения.

Так что я просто запустил команду netstat -an на этом ПК и нашел так много портов TCP и его состояние. Ниже приведена его часть (ошибка). Я показал только строки, в которых есть 25025.

Proto Local Address   Foreign Address  State 
TCP 0.0.0.0:25025   0.0.0.0:0    LISTENING 
TCP 192.168.1.79:25025  192.168.1.60:1320  TIME_WAIT 
TCP 192.168.1.79:25025  192.168.1.60:1321  TIME_WAIT 
TCP 192.168.1.79:58508  192.168.1.60:25025  TIME_WAIT 
TCP 192.168.1.79:58509  192.168.1.60:25025  TIME_WAIT 
TCP 192.168.1.79:58510  192.168.1.60:25025  TIME_WAIT 
TCP 192.168.1.79:58511  192.168.1.60:25025  ESTABLISHED 

Затем я проверил ту же команду, в которой у меня не было ошибок с моим приложением (правильная работа моего приложения). Выход был,

TCP 192.168.1.60:25025  192.168.1.79:58511  ESTABLISHED 

Так как я могу его устранить? Что это значит, столько портов с 25025 указывают. В случае ошибки у меня есть порт 25025, как показано выше. Поэтому, пожалуйста, помогите мне в понимании этого и решите проблему.

ответ

0

Проверьте, выполняется ли вызов bind() или нет. Я предполагаю, что, когда ваше приложение привязывается к порту прослушивания, он терпит неудачу с использованием «уже используемого адреса». Строки TIME_WAIT в выводе netstat показывают, что это так. Но я предполагаю, что ваше приложение не проверяет возвращаемое значение из bind() и слепо продолжает считать, что вызов преуспел. Это объясняет, почему он никогда ничего не получает.

Вы получаете адрес, который уже используется, если сокет не завершил его выключение из предыдущего вызова приложения. Как правило, требуется, чтобы сокет был готов к повторному использованию после того, как приложение было закрыто, и в то же время состояние TIME_WAIT.

Вы можете использовать опцию сокета SO_REUSEADDR, чтобы избежать этого периода TIME_WAIT.

Смежные вопросы