Найти - Пользователи
Полная версия: Обнуления буфера
Начало » Центр помощи » Обнуления буфера
1 2
sonchess2000
Здравствуйте.Есть программа, которая по udp принимает данные, которые посылаются постоянно. В этой программе надо после каждого прочтения обнулять буффер, чтобы читались актуальные данные и буфер не забивался старыми данными. Как это реализовать?
py.user.next
sonchess2000
В этой программе надо после каждого прочтения обнулять буффер
А как ты понял, что буфер не обнуляется?
sonchess2000
А как ты понял, что буфер не обнуляется?
Когда я перестаю передавать данные по udp, то в приеме идут старые данные, скопившиеся там некоторое время.
JOHN_16
sonchess2000
Не ясно что из себя представляет собой этот буфер - нужно посмотреть на рабочий код.
py.user.next
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]$

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

Ему нужно начальные сообщения отбросить, а последнее оставить.
sonchess2000
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()
py.user.next
sonchess2000
Что можно придумать?
Можно сделать класс, который будет постоянно читать и сохранять только последнее сообщение, и общаться с сетью через него. Для начала можно попробовать без многопоточности. Если же может быть много сообщений, то могут быть задержки, поэтому надо делать приём в параллельном потоке.

sonchess2000
когда я комментирую эту часть программы, то recv() работает так, как мне надо
Ну, пока там что-то отправляется, приходят новые сообщения и встают в очередь.
sonchess2000
py.user.next
Спасибо, но как это примерно выглядеть будет, многопоточность бы не хотелось использовать. Сейчас одна часть программы серверная шлет по udp данные, другая часть ( то,что выше ) принимает их и происходит это в двух разных потоках
py.user.next
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]$
sonchess2000
py.user.next
Спасибо вам большое, так работает, как надо и ошибок не выдает. Получается, что все сообщения, которые не успевают читаться заносятся в список и потом сбрасываются после команды recv()?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB