如何在python中创建对数据包生成器足够可靠的while循环

如何在python中创建对数据包生成器足够可靠的while循环,python,sockets,loops,networking,Python,Sockets,Loops,Networking,我正在制作一个数据包生成器,能够尽可能稳定和准确地发送数据包是至关重要的。我遇到的问题是,我使用带时间的while循环发送数据包。sleep本应循环数百次/秒,但由于循环需要额外且不断变化的时间,因此很难设置正确的睡眠时间 以下是我正在使用的代码: while status == "1": try: s.send(message) data = s.recv(1500) status = self.clientstatus

我正在制作一个数据包生成器,能够尽可能稳定和准确地发送数据包是至关重要的。我遇到的问题是,我使用带时间的while循环发送数据包。sleep本应循环数百次/秒,但由于循环需要额外且不断变化的时间,因此很难设置正确的睡眠时间

以下是我正在使用的代码:

while status == "1":
     try:
         s.send(message)
         data = s.recv(1500)
         status = self.clientstatus
         time.sleep(1.0 / (speed*100))
     except:
         status = "0"
编辑:

这是我使用的一个有效的解决方案

    def clientstart(self):
      self.sch = sched.scheduler(time.time, time.sleep)
      self.next_time = time.time()
      self.sch.enterabs(self.next_time, 0, self.oneround, ())

      self.reset.emit()
      time.sleep(0.03)

      n = 0
      targetip = self.entry1.text()
      host = targetip
      port = 5001
      speed = int(self.entry2.text())
      self.delay = 1.0 / (speed*100)

      if targetip:
              self.s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
              try:
                    self.s.connect((host,port))
              except:
                    self.err1.emit(1)
                    n = n+1
              openfile = open('1024')
              self.message = openfile.read()
              self.clientstatus = "1"
              status = self.clientstatus
              self.buttonswitch("2")
              n = n+1
              self.nn = 1
              t = threading.Thread(target = self.temp)
              t.setDaemon(True)
              t.start()
              self.err1.emit(2)
              self.sch.run()

              if n == 1:
                    self.err1.emit(4)
              elif n == 4:
                    self.err1.emit(0)
              self.s.close()
              self.buttonswitch("3")
      else:
              self.err1.emit(3)

    def oneround(self):
      try:
        self.s.send(self.message)
        status = self.clientstatus
        self.nn += 1
        if status == '1':
            self.next_time += self.delay
            self.sch.enterabs(self.next_time, 0, self.oneround, ())
      except:
        pass

将self与socket一起使用可能会在将来导致一些问题,尽管
sched
模块记录在中,这是计划周期性事件的最可靠的方法之一,与系统(当然不是实时的系统)所允许的定期性尽可能接近

对于您的用例,我会尝试:

import sched, time
sch = sched.scheduler(time.time, time.sleep)

delay = 1.0 / (speed*100)
next_time = time.time()

def oneround():
    try:
        s.send(message)
        data = s.recv(1500)
        status = self.clientstatus
        if status == '1':
            next_time += delay
            sch.enterabs(next_time, 0, oneround, ())
    except:
        pass

sch.enterabs(next_time, 0, oneround, ())

sch.run()

这将尽可能每
1.0/(速度*100)
秒接近一个事件——如果一个事件被延迟(我们不是在实时环境中,因此操作系统可能会导致不可预测的延迟),那么下一个事件将在将来安排得更近,&c。当在
sch
中没有输入更多内容时,隐含循环结束
sched
模块记录在中,这是安排周期性事件的最可靠的方法之一,当然是非实时系统所允许的最有规律的方法

对于您的用例,我会尝试:

import sched, time
sch = sched.scheduler(time.time, time.sleep)

delay = 1.0 / (speed*100)
next_time = time.time()

def oneround():
    try:
        s.send(message)
        data = s.recv(1500)
        status = self.clientstatus
        if status == '1':
            next_time += delay
            sch.enterabs(next_time, 0, oneround, ())
    except:
        pass

sch.enterabs(next_time, 0, oneround, ())

sch.run()

这将尽可能每
1.0/(速度*100)
秒接近一个事件——如果一个事件被延迟(我们不是在实时环境中,因此操作系统可能会导致不可预测的延迟),那么下一个事件将在将来安排得更近,&c。当在
sch
中没有输入更多内容时,隐含循环结束
sched
模块记录在中,这是安排周期性事件的最可靠的方法之一,当然是非实时系统所允许的最有规律的方法

对于您的用例,我会尝试:

import sched, time
sch = sched.scheduler(time.time, time.sleep)

delay = 1.0 / (speed*100)
next_time = time.time()

def oneround():
    try:
        s.send(message)
        data = s.recv(1500)
        status = self.clientstatus
        if status == '1':
            next_time += delay
            sch.enterabs(next_time, 0, oneround, ())
    except:
        pass

sch.enterabs(next_time, 0, oneround, ())

sch.run()

这将尽可能每
1.0/(速度*100)
秒接近一个事件——如果一个事件被延迟(我们不是在实时环境中,因此操作系统可能会导致不可预测的延迟),那么下一个事件将在将来安排得更近,&c。当在
sch
中没有输入更多内容时,隐含循环结束
sched
模块记录在中,这是安排周期性事件的最可靠的方法之一,当然是非实时系统所允许的最有规律的方法

对于您的用例,我会尝试:

import sched, time
sch = sched.scheduler(time.time, time.sleep)

delay = 1.0 / (speed*100)
next_time = time.time()

def oneround():
    try:
        s.send(message)
        data = s.recv(1500)
        status = self.clientstatus
        if status == '1':
            next_time += delay
            sch.enterabs(next_time, 0, oneround, ())
    except:
        pass

sch.enterabs(next_time, 0, oneround, ())

sch.run()

这将尽可能每
1.0/(速度*100)
秒接近一个事件——如果一个事件被延迟(我们不是在实时环境中,因此操作系统可能会导致不可预测的延迟),那么下一个事件将在将来安排得更近,&c。当在
sch

中没有输入更多内容时,隐含循环结束。我想测试一下,但我必须在函数oneround()之外创建套接字。这意味着我需要将套接字、延迟和消息作为参数传递,然后就无法使用sch.enterabs()再次调用该函数。有没有办法解决这个问题(比如在类范围内设置参数)或者我应该在oneround()中设置服务器?在我正确处理之后,您的建议非常有效。多谢各位。我将在这里添加工作代码我想测试一下,但我必须在函数oneround()之外创建套接字。这意味着我需要将套接字、延迟和消息作为参数传递,然后就无法使用sch.enterabs()再次调用该函数。有没有办法解决这个问题(比如在类范围内设置参数)或者我应该在oneround()中设置服务器?在我正确处理之后,您的建议非常有效。多谢各位。我将在这里添加工作代码我想测试一下,但我必须在函数oneround()之外创建套接字。这意味着我需要将套接字、延迟和消息作为参数传递,然后就无法使用sch.enterabs()再次调用该函数。有没有办法解决这个问题(比如在类范围内设置参数)或者我应该在oneround()中设置服务器?在我正确处理之后,您的建议非常有效。多谢各位。我将在这里添加工作代码我想测试一下,但我必须在函数oneround()之外创建套接字。这意味着我需要将套接字、延迟和消息作为参数传递,然后就无法使用sch.enterabs()再次调用该函数。有没有办法解决这个问题(比如在类范围内设置参数)或者我应该在oneround()中设置服务器?在我正确处理之后,您的建议非常有效。多谢各位。我将在这里添加工作代码