Системное администрирование

Пишу небольшую онлайн игру на пайтон, выдаёт эту ошибку

Traceback (most recent call last): File "C:\Users\natal\PycharmProjects\pythonProject\Game\ http://Game.py ", line 16, in new_socket,addr=main_socket.accept() File "C:\Program Files\Python37\lib\ http://socket.py ", line 212, in accept fd, addr = self._accept() BlockingIOError: [WinError 10035] Операция на незаблокированном сокете не может быть завершена немедленно
> Ошибка номер 10035: операция на незаблокированном сокете
> не может быть завершена немедленно.


ошибка 10035 означает, что внутренний буфер передачи занят и не может вместить (поставить к хвост очереди на передачу) тот целый объем данных, который ты затребовал в SendBuf()

дождись события On[Client]Write и в его обработчике повтори попытку отправки тех же самых данных, при предыдущей попытке отправки которых ты получил код отказа 10035

Да, большой объём данных приходится пересылать, если такая ошибка вылезла.

После такой ошибки надо ждать, когда возникнет OnSocketEvent с seWrite и только после этого возобновлять отправку данных.

Lock/Unlock к блокирующему и неблокирующему режиму работы сокета отношения не имеет.







скорость физической передачи данных (тех самых что поставлены тобой в очередь на передачу одним или несколькими последовательными вызовами send-методов) зависит от множества факторов, на которые ты программно повлиять не можешь (например, пропускная способность сети).. как ты ни пыжься, а TCP/IP- пакеты будут передаваться и приниматься (TCP протокол подразумевает квитирование доставляемых пакетов, это гарантирует их доставку) строго с той скоростью, которая возможна в дан.момент времени..

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

то что твои данные, требуемые к передаче, теряют актуальность быстрей физ.передачи - это твоя проблема, ты ОБЯЗАН учитывать этот фактор


> пересылку старых отменить как-то


"пересылку" ты отменить не можешь - данные уже помещены в хвост очереди передачи (являющей собой поток, в котором уже нет никакой возможности разделить отдельно записанные тобой фрагменты) и ждут своей очередности на физ.передачу... отмена передачи - это отмена всего потока передачи, которую можно осуществить только закрытием соединения
Юнир Абдуллин
Юнир Абдуллин
50 859
Лучший ответ
Беги от компа как можно быстрее.
учи С#