Операция не разрешается на неподключенных сокетах
Обновление: подправил код, чтобы он больше подходил к вашему случаю. const int listenPort = 11000; using (UdpClient listener = new UdpClient(listenPort)) < while (true) < var result = await listener.ReceiveAsync(); Console.WriteLine( $"Received from
Кстати у вас ошибка, ";" пропустили в var result = await listener.ReceiveAsync() и ")" в Console.WriteLine( $"Received from
а почему у меня process, register и т.д. подчёркивается? using System.Threading.Tasks; подключил, проект консольный.
@alex-rudenkiy потому что эти методы вы должны написать сами :) VladD их сюда вставил просто для примера.
@VladD ну я вот слегка промодернизировал ваш код, но программа как-то не очень уж и хочет работать с task. Тему обновил :(
@alex-rudenkiy: Что-то вы делаете не то. У вас в Process уже есть данные в буфере, зачем вы читаете их снова из сокета? Их там уже нет.
@VladD ой, а думал что туда будут подкачиваться все данные от клиента for (int i = 0; i < new Random().Next(100); i++) < udpClient.Send(sendBytes, sendBytes.Length); >. Я просто хотел сделать чтобы клиент мог отправлять серверу данные до тех пор пока сервер не перестанет говорить "Давай по новой".
@VladD по идее нужно дописать пришедшие буфферы в файл до тех пор пока сервер не перестанет запрашивать (в примере у меня, пока не перестанет отправлять "Давай по новой").
@VladD Спасибо, а можно сделать чтобы когда была повторная отправка данных серверу, то сервер сразу обрабатывал информацию в Process, не проходя через var result = await listener.ReceiveAsync(); Task processTask = Process(result); , мне кажется что если будет 100 клиентов одновременно отправлять данные на серв, то серв ляжет и мне будет не очень уж и удобно работать с клиентами, а так каждый клиент будет висеть в отдельном task'е и буду делать что захочу
@alex-rudenkiy: Боюсь, невозможно, потому что у вас в UDP нету понятия «соединение». Повторная посылка со стороны клиента будет вроде бы всё равно доставляться центральному слушателю. Но я покамест не вижу проблемы с сотней клиентов.
@VladD Я просто не знаю как работать с клиентами, ну в смысле я хотел чтобы в идеале это выглядело типа : list из класса в котором была бы ссылка(или указатели) на клиента(чтобы можно было бы легко обращаться к нему), числовая переменная которая хранила бы ID его, чтобы можно было определять от какого клиента пришли данные.
IPaddress не пойдёт, так как нельзя будет на моём компе несколько клиентов и тестить, а вот EndPoint вроде-бы пойдёт :)
Я работаю над проектом Android Studio с несколькими видами деятельности. В настоящее время я пытаюсь прочитать вывод сервлета Java на локальном хосте, но, похоже, он дает сбой из-за разрешения сокета.
Я создал новый проект, использовал тот же код и отлично работал. Поэтому я не понимаю, почему не хочу работать над моим проектом.
Я ожидаю, что он прочитает данные, но он вылетает в этой строке:
Это вывод ошибки:
Решено: все, что мне нужно было сделать, это удалить приложение с эмулятора или физического подключенного устройства и запустить его снова.
В моем случае мне пришлось предоставить разрешение ACCESS_NETWORK_STATE. Добавьте в манифест
. И удалить тоже
Удаление приложения из эмулятора и повторная установка решила мою проблему, спасибо. Кажется, что firebase кеширует что-то в файловой системе и повторно использует это, я полагаю, что чистые данные приложения также решат проблему.
возможно, разрешения уже кэшированы и снова и снова разрушают его, а не обновляют разрешение, а не обновляют только файлы src.? вот и помогла переустановка.
Просто удалите приложение из эмулятора, затем запустите снова, и оно заработает. У меня была такая же проблема
Не знаю как, но это работает. Публикация в декабре 2019 года. Хотя это работает, любопытно узнать, почему.
в AndroidManifest.xml
Верно, хотя, если это уже установлено и по-прежнему возникает та же ошибка - сделайте, как было предложено выше, - удалите приложение на устройстве и установите его снова.
Если вы забыли добавить в свой Manifest.xml, сделайте это сейчас
Если вы уже добавили его, но ошибка не исчезла, сначала удалите приложение, а затем снова запустите i.
Чаще всего я сталкиваюсь с той же проблемой, потому что забыл при первой установке.
ОС думала, что приложению не требуется разрешение в Интернете (что глупо, ИМО), и не проверяла никаких обновлений разрешений для приложения (что даже глупее ИМО).
Единственный способ указать ОС Android проверить ваши обновленные запросы разрешений - это сначала удалить приложение перед повторной установкой.
это было полезно для меня, но я считаю, что это не должно быть решением. Считаю это багом андроида. :(
братан, пусть высшая сила вознаградит тебя каким-нибудь образом, где бы ты ни был! Я потратил около 5 часов, пытаясь найти решение, но совет по переустановке unistall просто спас мне день. Спасибо брат. Решение Yoiur заслуживает того, чтобы быть отмеченным как ответ.
У меня проблема с подключением к удаленному провайдеру электронной почты с использованием следующего кода:
Есть ли у кого-нибудь опыт работы с этой проблемой? Мы будем очень благодарны за совет о том, как заставить это соединение работать.
Это ошибка, возникающая при запуске кода на развернутом сервере (общий сервер Arvixe IIS).
Спасибо @jstedfast, к сожалению, на этот пост нет ответа.
Полагаю, я мог бы обновить предыдущий пост, но он уже был довольно длинным, поэтому я выбрал новый. В любом случае новая информация - это информация об ошибке. Я подумал, что стоит включить. Я согласился с вами, что это абсолютно похоже на то, что что-то на стороне хоста или на стороне провайдера электронной почты блокирует, но и провайдер хостинга, и провайдер электронной почты «помогли» мне с этой проблемой с точки зрения настройки DNS, настройки брандмауэра и даже образца код без разрешения.
Какую версию MailKit вы используете? 2.0.7 пробовали? Как насчет 2.1.0.3?
Версия 2.1.0.0. Я установил его сегодня днем из NuGet, так что он должен быть самым последним.
2.1.0.3 был выпущен несколько дней назад и исправляет некоторые проблемы с Connect ().
Извините, NuGet сообщает мне, что у меня уже есть 2.1.0.3: пакет MailKit.2.1.0.3 уже существует в проекте MySolution.
Вы уже тестировали, что происходит с 2.0.7? В чем была ошибка?
Я не. После двух недель и трех билетов Arvixe согласилась исследовать ошибку. Я подожду, чтобы увидеть, найдут ли они проблему. Я думаю, это как-то связано с тем, как они управляют почтовым трафиком.
@JimmyBrick, Вы договорились об этом со своим хост-провайдером?
Еще нет. Вчера я запросил отчет о проделанной работе, но ничего не слышал.
Короче говоря, ответ заключается в том, чтобы не использовать Arvixe, если вы хотите отправлять через SMTP из внешнего электронного письма. Они этого не поддерживают. Ниже приведен ответ от их поддержки.
3. Электронный адрес ОТ и адрес электронной почты для аутентификации SMTP должны быть локальным пользователем на локальном сервере. Если у вас есть собственный удаленный почтовый сервер и вы собираетесь отправлять электронные письма через веб-скрипт на адреса электронной почты, которые являются локальными для вашего домена, то этот почтовый домен необходимо удалить с локального сервера (мы должны это сделать), и вам придется использовать учетную запись из другого домена, локального по отношению к серверу, с которого отправляется почта. В противном случае любая электронная почта, отправляемая в локальный домен, будет доставлена локально, а не на ваш удаленный сервер.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет коды ошибок для класса Socket.
Предпринята попытка получить доступ к объекту Socket способом, запрещенным его правами доступа.
Обычно разрешается использовать только адрес.
Указанное семейство адресов не поддерживается. Эта ошибка возвращается, если указано семейство IPv6-адресов, а стек протокола IPv6 не установлен на локальном компьютере. Эта ошибка возвращается, если указано семейство IPv4-адресов, а стек протокола IPv4 не установлен на локальном компьютере.
Выбранный IP-адрес является недопустимым в этом контексте.
На незаблокированном сокете Socket уже выполняется операция.
Удаленный узел активно отказывает в подключении.
Подключение сброшено удаленным компьютером.
В операции на сокете Socket пропущен обязательный адрес.
Выполняется правильная последовательность отключения.
Поставщиком основного сокета обнаружен недопустимый указатель адреса.
Ошибка при выполнении операции, вызванная отключением удаленного узла.
Такой узел не существует. Данное имя не является ни официальным именем узла, ни псевдонимом.
Отсутствует сетевой маршрут к указанному узлу.
Выполняется блокирующая операция.
Вызов к заблокированному сокету Socketбыл отменен.
Предоставлен недопустимый аргумент для члена объекта Socket.
Приложение инициировало перекрывающуюся операцию, которая не может быть закончена немедленно.
Объект Socket уже подключен.
У датаграммы слишком большая длина.
Приложение пытается задать значение KeepAlive для подключения, которое уже отключено.
Не существует маршрута к удаленному узлу.
Отсутствует свободное буферное пространство для операции объекта Socket.
Требуемое имя или IP-адрес не найдены на сервере имен.
Неустранимая ошибка, или не удается найти запрошенную базу данных.
Основной поставщик сокета не инициализирован.
Предпринята попытка выполнить операцию объекта Socket не на сокете.
Перекрывающаяся операция была прервана из-за закрытия объекта Socket.
Семейство адресов не поддерживается семейством протоколов.
Слишком много процессов используется основным поставщиком сокета.
Семейство протоколов не реализовано или не настроено.
Протокол не реализован или не настроен.
Для объекта Socket был использован неизвестный, недопустимый или неподдерживаемый параметр или уровень.
Неверный тип протокола для данного объекта Socket.
Запрос на отправку или получение данных отклонен, так как объект Socket уже закрыт.
Произошла неопознанная ошибка объекта Socket.
Указанный тип сокета не поддерживается в данном семействе адресов.
Операция Socket выполнена успешно.
Подсистема сети недоступна.
Истекло время ожидания попытки подключения, или произошел сбой при отклике подключенного узла.
Слишком много открытых сокетов в основном поставщике сокета.
Не удалось разрешить имя узла. Повторите попытку позже.
Указанный класс не найден.
Версия основного поставщика сокета выходит за пределы допустимого диапазона.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Подключает клиента к удаленному TCP-узлу, используя заданное имя узла и номер порта.
Connect(IPAddress[], Int32)
Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.
Параметры
Массив IPAddress узла, к которому выполняется подключение.
Номер порта, к которому выполняется подключение.
Исключения
Параметр ipAddresses имеет значение null .
Недействительный номер порта.
Произошла ошибка при попытке доступа к сокету.
Вызывающий объект, находящийся выше в стеке вызовов, не имеет разрешения на запрошенную операцию.
Этот метод может быть применен только для сокетов, которые используют флаг InterNetwork или InterNetworkV6.
Примеры
В следующем примере кода используется IPEndPoint подключение к удаленному узлу.
Примеры
В следующем примере кода для подключения к удаленному узлу используется IP-адрес и номер порта.
Применяется к
Комментарии
Вызовите этот метод, чтобы установить синхронное подключение к удаленному узлу с указанным именем узла и номером порта. Метод Connect блокируется до тех пор, пока он не будет подключен или не завершится сбоем. После подключения к удаленному узлу используйте GetStream метод для получения базового NetworkStream. Используйте его NetworkStream для отправки и получения данных.
Если протокол IPv6 включен и Connect(String, Int32) метод вызывается для подключения к узлу, разрешаемого для IPv6-адресов и IPv4-адресов, подключение к IPv6-адресу будет предпринята сначала перед IPv4-адресом. Это может привести к задержке времени установки подключения, если узел не прослушивает IPv6-адрес.
При получении SocketExceptionкода ошибки используется для SocketException.ErrorCode получения определенного кода ошибки. Получив этот код, вы можете ознакомиться с документацией по коду ошибки API Windows sockets версии 2, чтобы получить подробное описание ошибки.
Connect(IPEndPoint)
Подключает клиента к удаленному TCP-узлу, используя указанную удаленную сетевую конечную точку.
Параметры
Объект IPEndPoint, к которому выполняется подключение.
Исключения
Параметр remoteEp имеет значение null .
Произошла ошибка при обращении к сокету.
См. также раздел
Применяется к
Connect(String, Int32)
Подключает клиента к указанному порту заданного узла.
Параметры
DNS-имя удаленного узла, к которому планируется подключение.
Имя порта удаленного узла, к которому планируется подключение.
Исключения
Параметр hostname имеет значение null .
Параметр port не находится между MinPort и MaxPort.
Произошла ошибка при обращении к сокету.
Примеры
В следующем примере кода для подключения к удаленному узлу используется IP-адрес и номер порта.
Комментарии
Вызовите этот метод, чтобы установить синхронное подключение к указанному IPEndPointудаленному узлу. Перед вызовом Connect необходимо создать экземпляр IPEndPoint класса с помощью IP-адреса и номера порта. Используйте его IPEndPoint в remoteEP качестве параметра. Метод Connect будет блокироваться до тех пор, пока он не подключится или не завершится сбоем. После подключения к удаленному узлу используйте GetStream метод для получения базового NetworkStream. Используйте его NetworkStream для отправки и получения данных.
При получении SocketExceptionкода ошибки используется для SocketException.ErrorCode получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows sockets версии 2, чтобы получить подробное описание ошибки.
См. также раздел
Connect(IPAddress, Int32)
Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.
Параметры
Объект IPAddress узла, к которому выполняется подключение.
Номер порта, к которому выполняется подключение.
Исключения
Параметр address имеет значение null .
Параметр port имеет значение, не лежащее в диапазоне между MinPort и MaxPort.
Произошла ошибка при обращении к сокету.
Применяется к
Примеры
В следующем примере кода для подключения к удаленному узлу используется имя узла и номер порта.
Комментарии
Этот метод обычно используется сразу после вызова BeginGetHostAddresses метода, который может возвращать несколько IP-адресов для одного узла. Connect Вызовите метод, чтобы установить синхронное подключение удаленного узла к узлу, указанному массивом IPAddress элементов и номером порта. Метод Connect будет блокироваться до тех пор, пока он не подключится или не завершится сбоем. После подключения к удаленному узлу используйте GetStream метод для получения базового NetworkStream. Используйте его NetworkStream для отправки и получения данных.
При получении SocketExceptionкода ошибки используется для SocketException.ErrorCode получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows sockets версии 2, чтобы получить подробное описание ошибки.
Перегрузки
Подключает клиента к удаленному TCP-узлу, используя указанную удаленную сетевую конечную точку.
Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.
Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.
Подключает клиента к указанному порту заданного узла.
См. также раздел
Комментарии
Вызовите этот метод, чтобы установить синхронное подключение удаленного узла к указанному IPAddress номеру и номеру порта. Метод Connect будет блокироваться до тех пор, пока он не подключится или не завершится сбоем. После подключения к удаленному узлу используйте GetStream метод для получения базового NetworkStream. Используйте его NetworkStream для отправки и получения данных.
При получении SocketExceptionкода ошибки используется для SocketException.ErrorCode получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows sockets версии 2, чтобы получить подробное описание ошибки.
Читайте также: