0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 5

Socket.timeout при повторном recv()

26.07.2017, 15:00. Показов 4227. Ответов 3

Студворк — интернет-сервис помощи студентам
Python 3.5 Windows

Есть некая железка на микроконтроллере , работающая по TCP/IP , на ней используется LWIP.
Принцип ее работы прост - получает команду (256 байт ) - отдает ответ (256 байт)
В этом режиме все хорошо, и никаких проблем и вопросов.
Но есть часть команд, по которым железка отдает текущие данные , то есть сначала выстреливает заголовок (256 байт) , потом миллисекундная пауза и она начинает отдавать текущие данные по мере поступления, предопределенной ранее в команде длины, весь процесс может занимать до нескольких минут. Пока железка в режиме отдачи текущих данных - на другие команды не реагирует. В Дельфях и C# никаких проблем , получаю событие WSocket1DataAvailable в нем делаю Len := WSocket1.Receive(...) имею текущий буфер и его длину, могу по мере поступления данных их отображать.

В Питоне же могу получить только первый recv() - получаю всегда заголовок, вне зависимости от того что в параметрах recv() 256 байт, все последующие recv или recv_into вылетают с socket.timeout.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
conn = socket.socket()
conn.settimeout( 2.0)
conn.connect( (IP, PORT) )
 
conn.send(buffer_out)  # в buffer_out команда
 
s1=conn.recv(256)  # заголовок принимается , даже если s1=conn.recv(1024) получаю 256 байт
buffer_in = bytearray(TotalByte)
view = memoryview(buffer_in)
while TotalByte:
        try:
            nbytes = conn.recv_into(view, TotalByte)  
        except socket.timeout:
            print ('Socket timeout')
            continue        
        except:
            traceback.print_exc()
            print ('Socket err,)
            break
        view = view[nbytes:] 
        TotalByte -= nbytes
просто s2=recv(1024) пробовал . То же самое.
Понятно что просто Питона не знаю. Как написать правильно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2017, 15:00
Ответы с готовыми решениями:

Как отловить ошибку socket.timeout: timed out
Запрос на котором возникает ошибка self.proxy = {'http': 'socks5://181.101.35.69:1080', 'https': 'socks5://181.101.35.69:1080'} ...

Assembler linux. Socket recv and socket send invalid arguments
Пишу шеллкод. Он ожидает подключения с 2222 порта, сам подключается на 1111 порт, выделяет память, и должен выполняться пересылка сообщений...

socket recv
Есть ответ от сервера который приходит в виде: http://img850.imageshack.us/f/recv.png/ а с помощью функции recv я получаю только...

3
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
26.07.2017, 17:24
Не уверен, что проблема в этом, но загляните сюда
Socket Programming HOWTO
и обратите внимание на функцию myreceive.
Чтение из сокета не гарантирует немедленного возврата того объема данных, который вы запросили. Поэтому нужно читать в цикле указанным в документации способом.
0
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 5
27.07.2017, 11:05  [ТС]
Засунул сокет в поток - все чудесным образом заработало.
Впрочем, все равно собирался.
Ну и причина любому Windows-ятнику должна быть понятна )
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
29.07.2017, 15:25
Цитата Сообщение от fil1111 Посмотреть сообщение
Ну и причина любому Windows-ятнику должна быть понятна )
Можно всё же озвучить причину для чайников?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2017, 15:25
Помогаю со студенческими работами здесь

recv (socket api)
при первом в хождении в цикл рекв возвращает как положено количество принятых байт,но потом постоянно возвращает 1 почему? int size; ...

SOCKET: send(), recv()
Начал разбираться с сокетами и в самом начале застрял на элементарном, с функциями send и recv, в програмке в которой сервер отправляет...

Send/recv on listener socket
После переведения сокета в режим прослушивания (bind, listen), возможны ли на нем операции send/recv и к чему они приведут? Из документации...

Получить внешний ip, socket,recv( ), win
вопрос очень простой, почему данный код, прекрасно работающий на win7, не работает на win10 (не определяет ip) string GetExternalIP( ) ...

Обработка функции recv структуры SOCKET
Прошу помощи как обработать полученную информацию из функции recv структуры SOCKET. к примеру: char buf="GooD";char mass;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru