Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2015 19:33:19

sonchess2000
Зарегистрирован: 2015-01-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнуления буфера

Здравствуйте.Есть программа, которая по udp принимает данные, которые посылаются постоянно. В этой программе надо после каждого прочтения обнулять буффер, чтобы читались актуальные данные и буфер не забивался старыми данными. Как это реализовать?

Офлайн

#2 Янв. 10, 2015 23:34:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Обнуления буфера

sonchess2000
В этой программе надо после каждого прочтения обнулять буффер
А как ты понял, что буфер не обнуляется?



Офлайн

#3 Янв. 11, 2015 13:48:46

sonchess2000
Зарегистрирован: 2015-01-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнуления буфера

А как ты понял, что буфер не обнуляется?
Когда я перестаю передавать данные по udp, то в приеме идут старые данные, скопившиеся там некоторое время.

Отредактировано sonchess2000 (Янв. 11, 2015 13:49:35)

Офлайн

#4 Янв. 11, 2015 23:10:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Обнуления буфера

sonchess2000
Не ясно что из себя представляет собой этот буфер - нужно посмотреть на рабочий код.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Янв. 12, 2015 01:40:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Обнуления буфера

JOHN_16
Не ясно что из себя представляет собой этот буфер - нужно посмотреть на рабочий код.

udpserv.py
#!/usr/bin/env python3
 
import socket
 
HOST = ''
PORT = 12345
 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))
 
while True:
    input()
    data = s.recv(1024)
    print(data)

[guest@localhost py]$ for i in `seq 5`; do echo x$i | nc -u localhost 12345; done
[guest@localhost py]$

[guest@localhost py]$ ./udpserv.py 

b'x1\n'

b'x2\n'

b'x3\n'

b'x4\n'

b'x5\n'


^CTraceback (most recent call last):
File "./udpserv.py", line 13, in <module>
data = s.recv(1024)
KeyboardInterrupt
[guest@localhost py]$

Накапливаются сообщения, хоть блокирующий он, хоть не блокирующий.

Ему нужно начальные сообщения отбросить, а последнее оставить.



Отредактировано py.user.next (Янв. 12, 2015 01:44:08)

Офлайн

#6 Янв. 12, 2015 22:01:14

sonchess2000
Зарегистрирован: 2015-01-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнуления буфера

py.user.next
Накапливаются сообщения, хоть блокирующий он, хоть не блокирующий.Ему нужно начальные сообщения отбросить, а последнее оставить.
Что можно придумать?
В программе есть еще передача команды по http на камеру - вот тут главная проблема, потому что, когда я комментирую эту часть программы, то recv() работает так, как мне надо, но если снять комментарии, тогда нужно почему-то 5 раз вызвать эту команду и тогда выходит что-то похожее на правду, но почему 5 раз, я не понимаю.
import SocketServer
import httplib
import time
import socket
def clearBuffer(sock):
    for i in xrange(0,5):
        sock.recv(50)
class MyUDPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        sock= self.request[1]
        print "{} wrote:".format(self.client_address[0])
        print data
        socket.sendto(data.upper(), self.client_address) 
        dat = data.split(" ")
        ....
        ....
        #Вот здесь дальше идет отправка команды в виде строки по http на камеру
         if(len(cmd)):
             tCmdStart = time.clock()
             try:
                   t1 = time.clock()
                   conn.request("GET", cmd);conn.close()
                   t2 = time.clock()
             except:
                   conn.close()
            pause(tPause) #пауза рассчитывается в зависимости от переданной команды
             if((t2-t1)>1):
                 raise()
         clearBuffer(sock)
if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()

Отредактировано sonchess2000 (Янв. 13, 2015 07:30:25)

Офлайн

#7 Янв. 13, 2015 09:47:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Обнуления буфера

sonchess2000
Что можно придумать?
Можно сделать класс, который будет постоянно читать и сохранять только последнее сообщение, и общаться с сетью через него. Для начала можно попробовать без многопоточности. Если же может быть много сообщений, то могут быть задержки, поэтому надо делать приём в параллельном потоке.

sonchess2000
когда я комментирую эту часть программы, то recv() работает так, как мне надо
Ну, пока там что-то отправляется, приходят новые сообщения и встают в очередь.



Отредактировано py.user.next (Янв. 13, 2015 09:58:38)

Офлайн

#8 Янв. 13, 2015 10:28:17

sonchess2000
Зарегистрирован: 2015-01-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнуления буфера

py.user.next
Спасибо, но как это примерно выглядеть будет, многопоточность бы не хотелось использовать. Сейчас одна часть программы серверная шлет по udp данные, другая часть ( то,что выше ) принимает их и происходит это в двух разных потоках

Отредактировано sonchess2000 (Янв. 13, 2015 10:47:25)

Офлайн

#9 Янв. 13, 2015 20:16:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Обнуления буфера

sonchess2000
как это примерно выглядеть будет

udpserv_tm.py
#!/usr/bin/env python3
 
import socket
 
class P:
    def __init__(self, sockd):
        self.sockd = sockd
        self.sockd.setblocking(False)
 
    def __del__(self):
        self.sockd.setblocking(True)
 
    def recv(self, size=1024):
        msgs = []
        while True:
            try:
                msgs.append(self.sockd.recv(size))
            except BlockingIOError:
                break
        return msgs and msgs[-1]
 
HOST = ''
PORT = 12345
 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))
 
proxy = P(s)
 
while True:
    input()
    data = proxy.recv()
    print(data)

[guest@localhost udpserv]$ for i in `seq 1 5`; do echo x$i | nc -u localhost 12345; done
[guest@localhost udpserv]$ for i in `seq 6 10`; do echo x$i | nc -u localhost 12345; done
[guest@localhost udpserv]$ for i in `seq 11 15`; do echo x$i | nc -u localhost 12345; done
[guest@localhost udpserv]$

[guest@localhost udpserv]$ ./udpserv_tm.py 

b'x5\n'

b'x10\n'

b'x15\n'
^CTraceback (most recent call last):
File "./udpserv_tm.py", line 31, in <module>
input()
KeyboardInterrupt
[guest@localhost udpserv]$



Отредактировано py.user.next (Янв. 13, 2015 20:18:55)

Офлайн

#10 Янв. 14, 2015 10:24:18

sonchess2000
Зарегистрирован: 2015-01-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнуления буфера

py.user.next
Спасибо вам большое, так работает, как надо и ошибок не выдает. Получается, что все сообщения, которые не успевают читаться заносятся в список и потом сбрасываются после команды recv()?

Отредактировано sonchess2000 (Янв. 14, 2015 10:33:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version