sonchess2000А как ты понял, что буфер не обнуляется?
В этой программе надо после каждого прочтения обнулять буффер
А как ты понял, что буфер не обнуляется?Когда я перестаю передавать данные по udp, то в приеме идут старые данные, скопившиеся там некоторое время.
JOHN_16
Не ясно что из себя представляет собой этот буфер - нужно посмотреть на рабочий код.
#!/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Что можно придумать?
Накапливаются сообщения, хоть блокирующий он, хоть не блокирующий.Ему нужно начальные сообщения отбросить, а последнее оставить.
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Можно сделать класс, который будет постоянно читать и сохранять только последнее сообщение, и общаться с сетью через него. Для начала можно попробовать без многопоточности. Если же может быть много сообщений, то могут быть задержки, поэтому надо делать приём в параллельном потоке.
Что можно придумать?
sonchess2000Ну, пока там что-то отправляется, приходят новые сообщения и встают в очередь.
когда я комментирую эту часть программы, то recv() работает так, как мне надо
sonchess2000
как это примерно выглядеть будет
#!/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]$