Код ошибки сокета 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 на связанной странице).