在C中定期从客户端向服务器发送数据

时间:2014-12-07 17:05:15

标签: c sockets sleep server period

我正在创建一个多线程套接字程序,需要定期向服务器发送2组数据。客户需要每3秒发送一次GPS信息,每4秒发送一次极性信息。我实现这个的想法是简单地创建一个新线程,进行无限循环,发送()GPS信息,sleep()1秒钟,发送()极性信息,然后睡眠()2秒。这是否足以成为解决这个问题的方法?对不起,我是socket编程的新手,所以我不知道有什么替代方法。

1 个答案:

答案 0 :(得分:1)

您提出的方案是:

  

发送GPS信息,睡眠1秒钟,发送极性信息,然后睡眠2秒

在12秒的时间内,这导致:

  1. GPS;睡1
  2. 极性;睡1
  3. sleep 1
  4. GPS;睡1
  5. 极性;睡1
  6. sleep 1
  7. GPS;睡1
  8. 极性;睡1
  9. sleep 1
  10. GPS;睡1
  11. 极性;睡1
  12. sleep 1
  13. 根据规范要求,它发送GPS信息4次(正确)和极性4次,每3秒发送一次,而不是3次,每4秒发送一次。所需的顺序可能是:

    1. GPS;极性;睡1
    2. sleep 1
    3. sleep 1
    4. GPS;睡1
    5. 极性;睡1
    6. sleep 1
    7. GPS;睡1
    8. sleep 1
    9. 极性;睡1
    10. GPS;睡1
    11. sleep 1
    12. sleep 1
    13. 请注意,在某些时候,必须发送GPS和极性。

      您可以通过两种方式实现此目的。假设您需要使用线程,请使用两个线程,一个在三秒钟等待,一个在四秒钟等待。使用互斥锁协调对套接字的访问,以便在12秒的倍数上,您仍然可以获得理智的行为。

      但是,您可以使用等待适当间隔的单线程进程来完成所有操作:

      int i_gps = 3;
      int i_pol = 4;
      int t_gps = 0;
      int t_pol = 0;
      int t_cur = 0;
      
      while (1)
      {
          if (t_cur == t_gps && t_cur == t_pol)
          {
              t_cur = t_gps = t_pol = 0;  // Avoid integer overflow
          }
          if (t_cur == t_gps)
          {
              send GPS
              t_gps += i_gps;
          }
          if (t_cur == t_pol)
          {
              send polarity
              t_pol += i_pol;
          }
          sleep 1;
          t_cur++;
      }
      

      您还可以通过更改循环结束时的代码来休眠几秒钟,以确定接下来发送的数据并在适当的时间内休眠并将t_cur递增适当的时间(而不是只是一直使用1秒。

      如果你需要避免漂移(因为上面的代码假定发送过程是瞬时的并且它不是),那么你必须使用亚秒级睡眠并在循环开始时捕获时间并且调整睡眠间隔以允许进行发送所花费的时间。