Нет данных о сокете подключения Windows 10
Обновлено: 03.07.2024
Функция recv получает данные из подключенного сокета или связанного сокета без установления соединения.
Синтаксис
Параметры
Дескриптор, идентифицирующий подключенный сокет.
Указатель на буфер для приема входящих данных.
Длина в байтах буфера, на который указывает параметр buf.
Набор флагов, влияющих на поведение этой функции. См. примечания ниже. Дополнительные сведения о возможном значении этого параметра см. в разделе "Примечания".
Возвращаемое значение
Если ошибок не возникает, recv возвращает количество полученных байтов, и буфер, на который указывает параметр buf, будет содержать полученные данные. Если соединение было корректно закрыто, возвращаемое значение равно нулю.
В противном случае возвращается значение SOCKET_ERROR, и конкретный код ошибки можно получить, вызвав WSAGetLastError.
Код ошибки | Значение |
---|---|
WSANOTINITIALISED | Перед использованием этой функции должен произойти успешный вызов WSAStartup. |
WSAENETDOWN | Сбой сетевой подсистемы. |
WSAEFAULT | buf параметр не полностью содержится в допустимой части адресного пространства пользователя. |
WSAENOTCONN | сокет не подключен. |
WSAEINTR | Вызов (блокирующий) был отменен с помощью WSACancelBlockingCall.< /td> |
WSAEINPROGRESS | Выполняется блокирующий вызов Windows Sockets 1.1, или поставщик услуг все еще обрабатывает функция обратного вызова. |
WSAENETRESET | Для сокета, ориентированного на соединение, эта ошибка указывает, что соединение га s был нарушен из-за активности keep-alive, которая обнаружила сбой во время выполнения операции. Для сокета дейтаграммы эта ошибка указывает на то, что время жизни истекло. |
WSAENOTSOCK | Дескриптор не является сокетом. |
WSAEOPNOTSUPP | MSG_OOB был указан, но сокет не стиль потока, такой как тип SOCK_STREAM, данные OOB не поддерживаются в коммуникационном домене, связанном с этим сокетом, или сокет является однонаправленным и поддерживает только операции отправки. |
WSAESHUTDOWN | Сокет закрыт; невозможно получить через сокет после того, как было вызвано завершение работы с параметром как SD_RECEIVE или SD_BOTH. |
WSAEWOULDBLOCK | Сокет помечен как неблокирующий, и операция приема будет заблокирована. |
WSAEMSGSIZE | Сообщение было слишком большим, чтобы поместиться в указанный буфер, и было усечено. |
WSAEINVAL | Сокет не был привязан с помощью привязки, или был указан неизвестный флаг, или был указан MSG_OOB для сокета с включенным SO_OOBINLINE, или (только для сокетов потока байтов) len было равно нулю или отрицательному значению.< /td> |
WSAECONNABORTED | Виртуальный канал был прерван из-за тайм-аута или другого сбоя. Приложение должно закрыть сокет, так как его больше нельзя использовать. |
WSAETIMEDOUT | Соединение был удален из-за сбоя в сети или из-за того, что одноранговая система не ответила. |
WSAECONNRESET | Виртуальный канал был сброшен удаленной стороной, выполнившей жесткое или аварийное закрытие. Приложение должно закрыть сокет, так как его больше нельзя использовать. В сокете UDP-датаграммы эта ошибка указывает на то, что предыдущая операция отправки привела к появлению сообщения ICMP «Порт недоступен». |
Примечания
Функция recv используется для чтения входящих данных из сокетов, ориентированных на установление соединения, или сокетов без установления соединения. При использовании протокола, ориентированного на соединение, сокеты должны быть подключены до вызова recv. При использовании протокола без установления соединения сокеты должны быть привязаны перед вызовом recv.
Должен быть известен локальный адрес сокета. Для серверных приложений используйте явную функцию связывания или неявную функцию принятия или функцию WSAAccept. Явное связывание не рекомендуется для клиентских приложений. Для клиентских приложений сокет может быть неявно привязан к локальному адресу с помощью подключения, WSAConnect, sendto, WSASendTo или WSAJoinLeaf.
Для сокетов с подключением или без подключения функция recv ограничивает адреса, с которых принимаются полученные сообщения. Функция возвращает сообщения только с удаленного адреса, указанного в соединении.Сообщения с других адресов (молча) отбрасываются.
Для сокетов, ориентированных на соединение (например, типа SOCK_STREAM), вызов recv вернет столько данных, сколько доступно в данный момент — вплоть до размера указанного буфера. Если сокет сконфигурирован для встроенного приема данных OOB (параметр сокета SO_OOBINLINE) и данные OOB еще не прочитаны, будут возвращены только данные OOB. Приложение может использовать команду ioctlsocket или WSAIoctlSIOCATMARK, чтобы определить, остались ли еще данные OOB для чтения.
Для сокетов без установления соединения (типа SOCK_DGRAM или других сокетов, ориентированных на сообщения) данные извлекаются из первой поставленной в очередь дейтаграммы (сообщения) с адреса назначения, указанного функцией соединения.
Если дейтаграмма или сообщение больше указанного буфера, буфер заполняется первой частью дейтаграммы, а recv генерирует ошибку WSAEMSGSIZE. Для ненадежных протоколов (например, UDP) теряются лишние данные; для надежных протоколов данные сохраняются поставщиком услуг до тех пор, пока они не будут успешно прочитаны путем вызова recv с достаточно большим буфером.
Если в сокете нет доступных входящих данных, вызов recv блокируется и ожидает поступления данных в соответствии с правилами блокировки, определенными для WSARecv, с неустановленным флагом MSG_PARTIAL, если только сокет не является неблокирующим. В этом случае возвращается значение SOCKET_ERROR с кодом ошибки, установленным на WSAEWOULDBLOCK. Функции select, WSAAsyncSelect или WSAEventSelect можно использовать для определения поступления дополнительных данных.
Если сокет ориентирован на соединение, а удаленная сторона изящно разорвала соединение и все данные были получены, recv завершится немедленно с нулевым полученным байтом. Если соединение было сброшено, получение завершится с ошибкой WSAECONNRESET.
Параметр flags можно использовать для влияния на поведение вызова функции за пределами параметров, указанных для соответствующего сокета. Семантика этой функции определяется параметрами сокета и параметром flags. Возможное значение параметра flags создается с помощью побитового оператора ИЛИ с любым из следующих значений.
- Буфер, предоставленный вызывающей стороной, полностью заполнен.
- Соединение закрыто.
- Запрос отменен или произошла ошибка.
Примечание. При выполнении блокирующего вызова Winsock, такого как recv, Winsock может потребоваться дождаться сетевого события, прежде чем вызов сможет завершиться. В этой ситуации Winsock выполняет ожидание с предупреждением, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в том же потоке. Выполнение другого блокирующего вызова Winsock внутри APC, прервавшего текущий блокирующий вызов Winsock в том же потоке, приведет к неопределенному поведению и никогда не должно предприниматься клиентами Winsock.
Пример кода
Пример кода
Windows Phone 8: эта функция поддерживается для приложений Windows Phone Store в Windows Phone 8 и более поздних версиях.
Windows 8.1 и Windows Server 2012 R2: эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версиях.
Протоколы TCP и UDP работают на основе номеров портов, используемых для установления соединения. Любому приложению или службе, которым необходимо установить соединение TCP/UDP, потребуется порт на его стороне.
Существует два типа портов:
В ситуации, когда один и тот же браузер создает множество подключений к нескольким веб-сайтам, для любого нового подключения, которое пытается установить браузер, используется эфемерный порт. Через некоторое время вы заметите, что соединения начнут давать сбои, и одна из вероятных причин этого может заключаться в том, что браузер использовал все доступные порты для установления соединений снаружи, и любая новая попытка установить соединение будет неудачной, поскольку больше нет доступные порты. Когда все порты на машине используются, мы называем это исчерпанием портов.
Диапазон динамических портов по умолчанию для TCP/IP
В соответствии с рекомендациями Управления по присвоению номеров в Интернете (IANA) корпорация Майкрософт увеличила динамический диапазон клиентских портов для исходящих подключений. Новый начальный порт по умолчанию — 49152, а новый конечный порт — 65535. Это отличие от конфигурации более ранних версий Windows, в которых использовался диапазон портов по умолчанию от 1025 до 5000.
Вы можете просмотреть динамический диапазон портов на компьютере с помощью следующих команд netsh:
- netsh int ipv4 показать динамический порт TCP
- netsh int ipv4 показать динамический порт udp
- netsh int ipv6 показать динамический порт TCP
- netsh int ipv6 показать динамический порт udp
Диапазон задается отдельно для каждого транспорта (TCP или UDP). Диапазон портов теперь представляет собой диапазон, который имеет начальную и конечную точки.У клиентов Microsoft, которые развертывают серверы под управлением Windows Server, могут возникнуть проблемы, влияющие на связь RPC между серверами, если во внутренней сети используются брандмауэры. В таких случаях рекомендуется перенастроить брандмауэры, чтобы разрешить трафик между серверами в диапазоне динамических портов от 49152 до 65535. Этот диапазон является дополнением к общеизвестным портам, используемым службами и приложениями. Либо диапазон портов, используемых серверами, можно изменить на каждом сервере. Вы настраиваете этот диапазон с помощью команды netsh следующим образом. Приведенная выше команда устанавливает динамический диапазон портов для TCP.
Начальный порт — это число, а общее количество портов — это диапазон. Ниже приведены примеры команд:
- netsh int ipv4 set dynamicport tcp start=10000 num=1000
- netsh int ipv4 set dynamicport udp start=10000 num=1000
- netsh int ipv6 set dynamicport tcp start=10000 num=1000
- netsh int ipv6 set dynamicport udp start=10000 num=1000
Эти примеры команд задают динамический диапазон портов, начиная с порта 10000 и заканчивая портом 10999 (1000 портов). Минимальный диапазон портов, который можно установить, — 255. Минимальный начальный порт, который можно установить, — 1025. Максимальный конечный порт (на основе настраиваемого диапазона) не может превышать 65535. Чтобы воспроизвести поведение по умолчанию Windows Server 2003, используйте 1025 в качестве начального порта, а затем используйте 3976 в качестве диапазона для TCP и UDP. Это приводит к начальному порту 1025 и конечному порту 5000.
В частности, об исходящих подключениях, поскольку для входящих подключений не требуется эфемерный порт для приема подключений.
Поскольку исходящие соединения начинают прерываться, вы можете столкнуться со многими из следующих ситуаций:
Не удается войти на компьютер с учетными данными домена, однако вход с локальной учетной записью работает. Для входа в домен потребуется связаться с контроллером домена для проверки подлинности, которая снова является исходящим соединением. Если у вас установлены учетные данные кэша, вход в домен может по-прежнему работать.
RDP с уязвимого сервера не работает:
После корректного закрытия или резкого закрытия сеанса через 4 минуты (по умолчанию) порт, используемый процессом или приложением, будет освобожден обратно в доступный пул. В течение этих 4 минут состояние TCP-соединения будет TIME_WAIT. В ситуации, когда вы подозреваете исчерпание портов, приложение или процесс не сможет освободить все использованные порты и останется в состоянии TIME_WAIT.
Вы также можете увидеть соединения в состоянии CLOSE_WAIT в том же выводе; однако состояние CLOSE_WAIT — это состояние, когда на одной стороне однорангового узла TCP больше нет данных для отправки (отправлен FIN), но есть возможность получать данные с другого конца.Это состояние не обязательно указывает на исчерпание портов.
Наличие огромных подключений в состоянии TIME_WAIT не всегда указывает на то, что на сервере в настоящее время нет портов, если не проверены первые два пункта. Наличие большого количества соединений TIME_WAIT указывает на то, что процесс создает много соединений TCP и может в конечном итоге привести к исчерпанию портов.
Netstat был обновлен в Windows 10 с добавлением ключа -Q, чтобы показать порты, которые перешли из ожидания по времени, как в состоянии BOUND. Выпущено обновление для Windows 8.1 и Windows Server 2012 R2, содержащее эту функциональность. Командлет PowerShell Get-NetTCPConnection в Windows 10 также показывает эти связанные порты.
До 10 сентября 2016 г. данные netstat были неточными. Исправления для netstat, перенесенные обратно в 2012 R2, позволили Netstat.exe и Get-NetTcpConnection правильно сообщать об использовании порта TCP или UDP в Windows Server 2012 R2. Дополнительные сведения см. в разделе Windows Server 2012 R2: исправления временных портов.
Откройте командную строку в режиме администратора и выполните приведенную ниже команду
Откройте файл server.etl с помощью сетевого монитора и в разделе фильтра примените фильтр Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209. Вы должны увидеть записи, которые говорят STATUS_TOO_MANY_ADDRESSES. Если вы не найдете никаких записей, значит сервер все еще не исчерпал порты. Если вы их найдете, вы можете подтвердить, что на сервере исчерпаны порты.
Устранение неполадок с нехваткой портов
Суть в том, чтобы определить, какой процесс или приложение использует все порты. Ниже приведены некоторые инструменты, которые можно использовать для изоляции одного процесса
Способ 1
Начните с просмотра выходных данных netstat. Если вы используете Windows 10 или Windows Server 2016, вы можете запустить команду netstat -anobq и проверить идентификатор процесса, который имеет максимальное количество записей как BOUND. Кроме того, вы также можете запустить приведенную ниже команду PowerShell, чтобы идентифицировать процесс:
Большинство утечек портов вызвано тем, что процессы пользовательского режима неправильно закрывают порты при обнаружении ошибки. На уровне пользовательского режима порты (фактически сокеты) являются дескрипторами. И TaskManager, и ProcessExplorer могут отображать количество дескрипторов, что позволяет определить, какой процесс использует все порты.
Для Windows 7 и Windows Server 2008 R2 вы можете обновить версию PowerShell, включив указанный выше командлет.
Метод 2
Если метод 1 не помогает определить процесс (до Windows 10 и Windows Server 2012 R2), загляните в Диспетчер задач:
Добавьте столбец под названием «обработчики» в разделе сведений/процессов.
Отсортируйте дескрипторы столбца, чтобы определить процесс с наибольшим количеством дескрипторов. Обычно виновником может быть процесс с дескрипторами больше 3000, за исключением таких процессов, как System, lsass.exe, store.exe, sqlsvr.exe.
Выберите Вид \ Показать нижнюю панель.
Выберите Вид \ Вид нижней панели \ Ручки.
Нажмите на столбец Handles для сортировки по этому значению.
Изучите процессы с большим числом дескрипторов, чем у остальных (вероятнее всего, их будет более 10 000, если вы не можете устанавливать исходящие соединения).
Нажмите, чтобы выделить один из процессов с большим количеством дескрипторов.
На нижней панели дескрипторы, перечисленные ниже, являются сокетами. (Технически сокеты — это файловые дескрипторы).
Для решения различных проблем с ПК мы рекомендуем DriverFix:
Это программное обеспечение будет поддерживать работоспособность ваших драйверов, тем самым защищая вас от распространенных компьютерных ошибок и сбоев оборудования. Проверьте все свои драйверы прямо сейчас, выполнив 3 простых шага:
Доступ к сети имеет решающее значение для пользователей Windows 10, но, к сожалению, многие пользователи Windows 10 сообщают об определенных проблемах с сетью.
Одной из таких проблем является сообщение об ошибке Отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, что может помешать вам получить доступ к Интернету. Хотя это серьезная проблема, есть несколько доступных решений.
Вот еще несколько сообщений об ошибках, к которым можно применить те же решения:
- На этом компьютере Windows 10 отсутствует один или несколько сетевых протоколов.
- Winsock отсутствует в реестре
- Не удалось добавить запрошенную функцию, заблокированную групповой политикой.
Как исправить ошибку «Отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети»?
1. Удалите ключи Winsock из реестра и переустановите TCP/IP
Это решение требует изменения вашего реестра, поэтому во избежание возможных проблем рекомендуется создать резервную копию разделов реестра, которые вы собираетесь изменить. Для этого выполните следующие действия:
- Нажмите клавишу Windows + R и введите regedit. Нажмите Enter или OK.
- Когда откроется Редактор реестра, перейдите к следующему разделу на левой панели:
- Найдите ключи Winsock и WinSock 2, щелкните каждый из них правой кнопкой мыши и выберите Экспорт.
- Введите имя файла и сохраните его. Эти файлы будут использоваться для резервного копирования, если что-то пойдет не так.
- После создания резервной копии этих ключей удалите их из редактора реестра. Для этого просто щелкните правой кнопкой мыши каждый ключ и выберите в меню "Удалить".
- Закройте редактор реестра. ол>р>
- Нажмите клавишу Windows + R и введите regedit. Нажмите Enter, чтобы запустить редактор реестра.
- После открытия редактора реестра перейдите к
- Нажмите клавишу Windows + X и выберите "Командная строка (администратор)".
- После запуска командной строки введите netsh int ipv4 install и нажмите Enter, чтобы запустить ее.
- Закройте Командную строку и перезагрузите компьютер.
- Откройте Центр управления сетями и общим доступом, выберите подключение и нажмите "Свойства".
- Теперь выберите Интернет-протокол версии 4 (TCP/IPv4) и нажмите "Свойства".
- Когда откроется окно Свойства протокола Интернета версии 4, нажмите кнопку "Дополнительно".
- Чтобы перейти на вкладку WINS, снимите флажок Включить поиск LMHOSTS. Некоторые пользователи также предлагают выбрать параметр «Отключить NetBIOS через TCP/IP», чтобы вы могли попробовать и его.
- Нажмите "ОК", чтобы сохранить изменения. ол>р>
- Нажмите клавишу Windows + X и выберите в меню Командная строка (Администратор).
- После запуска Командной строки вам необходимо ввести следующие строки. Нажмите Enter после каждой строки, чтобы запустить ее:
- netcfg -d
- ipconfig/релиз
- ipconfig/обновить
- ipconfig /flushdns
- ipconfig /registerdns
После удаления ключей Winsock нам необходимо переустановить TPC/IP. Для этого следуйте этим инструкциям:
2. Сбросить Winsock
Если вы получаете сообщение об ошибке Отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, вам необходимо выполнить сброс Winsock, чтобы исправить это. Для этого выполните следующие действия:
3. Сбросить TCP/IP с помощью командной строки
Чтобы решить эту проблему, пользователи предлагают сбросить TCP/IP с помощью команды netsh в командной строке. Для этого выполните следующие действия:
Стоит отметить, что иногда вы можете получить сообщение в командной строке о том, что Не удалось выполнить сброс. Доступ запрещен. Если вы получили это сообщение, вам необходимо сделать следующее:
После внесения изменений в редакторе реестра можно попробовать снова запустить командную строку и команду netsh int ip reset.
4. Обновите/удалите драйверы
Записи реестра сокетов Windows, необходимые для подключения к сети, отсутствуют сообщение об ошибке может появиться после обновления Windows 10, и несколько пользователей сообщили, что сообщение об ошибке было исправлено после загрузки последних версий драйверов для их устройств. р>
Чтобы загрузить последние версии драйверов, просто посетите веб-сайт производителя материнской платы или сетевой карты и загрузите последние версии драйверов для своего устройства.
Мы также настоятельно рекомендуем DriverFix автоматически загружать все устаревшие драйверы на ваш компьютер. Этот инструмент защитит вашу систему, так как вы можете вручную загрузить и установить неправильную версию драйвера.
Немногие пользователи также предлагают удалить драйверы из диспетчера устройств. Для этого выполните следующие действия:
Если проблема не устранена с драйверами по умолчанию, попробуйте обновить их до последней версии, следуя приведенным выше инструкциям.
5. Отключить IPv6
Согласно пользователям, сообщение об ошибке отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, может быть вызвано IPv6, поэтому для решения этой проблемы пользователям рекомендуется отключить IPv6. Для этого выполните следующие действия:
Кроме того, вы можете отключить IPv6 в редакторе реестра, выполнив следующие действия:
клавиша на левой панели.
6. Отключить сетевые адаптеры
Это простое решение, но оно может оказаться полезным. Чтобы отключить сетевой адаптер, выполните следующие простые действия:
7. Отключить прокси
Совет эксперта. Некоторые проблемы с ПК трудно решить, особенно когда речь идет о поврежденных репозиториях или отсутствующих файлах Windows. Если у вас возникли проблемы с исправлением ошибки, возможно, ваша система частично сломана. Мы рекомендуем установить Restoro, инструмент, который просканирует вашу машину и определит, в чем проблема.
Нажмите здесь, чтобы загрузить и начать восстановление.
Чтобы отключить прокси, вам необходимо сделать следующее:
Кроме того, вы можете проверить прокси-сервер, выполнив следующие действия:
8. Используйте команду установки netsh int ipv4
Чтобы решить эту проблему, пользователи предлагают использовать команду netsh в командной строке. Для этого выполните следующие действия:
9. Сбросьте прошивку роутера
Немногие пользователи утверждают, что их проблема была решена после сброса прошивки маршрутизатора.
Это сложный процесс, и если вы не будете осторожны, вы можете привести к необратимому повреждению вашего маршрутизатора, поэтому обязательно ознакомьтесь с инструкциями по эксплуатации вашего маршрутизатора.
10. Получите ваш IP-адрес и DNS автоматически
Отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, иногда может появляться сообщение об ошибке, если ваша конфигурация IP-адреса и DNS-адреса неверна.
Чтобы решить эту проблему, вам потребуется автоматически получить свой IP-адрес и DNS. Для этого выполните следующие действия:
11. Перезагрузите маршрутизатор
Иногда такие проблемы можно решить, просто перезапустив маршрутизатор. Для этого просто нажмите кнопку питания на маршрутизаторе, чтобы выключить его. Подождите минуту или две и снова включите маршрутизатор.
Если проблема не устранена, вы можете перезагрузить маршрутизатор. Если вы решите сбросить настройки маршрутизатора, вы вернете его к заводским настройкам, поэтому вам, возможно, придется снова настроить беспроводную сеть. Чтобы сбросить настройки маршрутизатора, ознакомьтесь с подробным объяснением в руководстве по эксплуатации маршрутизатора.
12. Отключить поиск LMHOSTS
Для решения проблемы отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, некоторые пользователи предлагают отключить поиск LMHOSTS. Для этого просто следуйте этим инструкциям:
13. Попробуйте использовать проводное соединение
Иногда эти проблемы могут быть вызваны использованием адаптера HomePlug, и для решения этой проблемы настоятельно рекомендуется подключить компьютер к маршрутизатору с помощью кабеля Ethernet.
14. Перезагрузите компьютер
В некоторых случаях отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, что можно исправить путем надлежащего перезапуска Windows 10.
Выключить компьютер не получится, поскольку Windows 10 сохраняет часть ваших данных, когда вы выключаете компьютер, чтобы ускорить запуск. Поэтому вместо того, чтобы выключать компьютер, просто перезагрузите его, нажав кнопку перезагрузки, и проверьте, решена ли проблема.
15. Используйте команду ipconfig
Отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети. Это можно исправить с помощью команды ipconfig из командной строки. Для этого вам необходимо выполнить следующие действия:
После того, как вы ввели эти команды, перезагрузите компьютер и проверьте, решена ли проблема.
16. Установите DNS на 8.8.8.8
Чтобы изменить DNS, вам нужно будет повторить шаги, аналогичные Решению 10. Когда вы откроете окно свойств Интернет-протокола версии 4, просто выберите «Использовать следующие адреса DNS-серверов» и введите 8.8.8.8 в качестве предпочтительного и 8.8. 4.4 в качестве альтернативного DNS-сервера.
Отсутствуют записи реестра сокетов Windows, необходимые для подключения к сети, может вызвать множество проблем, но, надеюсь, вам удалось решить эту проблему, воспользовавшись одним из наших решений.
Не забудьте сообщить нам, какой из этих методов сработал для вас, нажав на раздел комментариев ниже.
По-прежнему возникают проблемы? Исправьте их с помощью этого инструмента:
Читайте также: