Код ошибки сокета Windows 10055

Я разработал приложение, которое использует сокеты поверх окон. Это работает отлично, но через некоторое время интернет-соединение начинает обрываться, и, наконец, я получаю эту ошибку (10055), что означает, что моему приложению не хватает буферного пространства.

На самом деле, я думаю, что я использую только 2 сокета с кодом, который я сделал сам, но это правда, что я использую стороннюю библиотеку, и я понятия не имею, как она реализована.

Я читал, что есть много литературы об этой проблеме, поэтому я не единственный, кто страдает от этого, но я не могу понять, как ее решить, или, по крайней мере, обойти ее, потому что, когда она терпит неудачу, она делает мой компьютер потерял подключение к интернету. Я попробовал это, поймав эту ошибку и, когда это происходит, делает WSACleanup(), WSAStartup() даже когда это не лучшая практика... но мое приложение все еще застревает в этой ошибке.

Любой совет будет в значительной степени оценен.

3 ответа

Решение

Обычно это происходит, когда вы правильно не закрываете сокет. Убедитесь, что у вас есть оба shutdown а также closesocket когда вы хотите закрыть сокет ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms741394(v=vs.85).aspx) из MSDN - "Note To assure that all data is sent and received on a connection, an application should call shutdown before calling closesocket"

До тебя bind розетка, вы можете использовать SO_REUSEADDR за setsocketopt который будет "Allows the socket to be bound to an address that is already in use" ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx)

Наконец, посмотрите на этот блог - http://blogs.technet.com/b/yongrhee/archive/2011/12/19/how-to-troubleshoot-a-handle-leak.aspx

Одной из причин этой ошибки в Windows является исчерпание эфемерного пула портов TCP.

Эту ошибку легко воспроизвести: просто создайте программу, которая зацикливается на привязке порта 0. Очень скоро эта ошибка произойдет.

Когда мы передаем 0 функции сокета bind, Windows выбирает эфемерный порт для использования.

У вас есть одна или несколько утечек ресурсов в вашем приложении.

Без кода я могу дать только общие рекомендации.

Я рекомендую вам запустить Valgrind или аналогичные инструменты, чтобы помочь вам найти утечку ресурсов.

Другой способ заключается в просмотре кода. Если утечка началась недавно, вы, вероятно, можете найти ее, просмотрев последние изменения.

В MSDN есть статья о том, как найти утечки памяти с помощью Visual Studio. (Не забудьте выбрать свою версию Visual Studio на связанной странице).

Другие вопросы по тегам