gpt4 book ai didi

c - C语言中定期从客户端向服务器发送数据

转载 作者:行者123 更新时间:2023-11-30 15:26:27 25 4
gpt4 key购买 nike

我正在创建一个多线程套接字程序,需要定期向服务器发送2组数据。客户端需要每3秒发送一次GPS信息,每4秒发送一次极性信息。我的实现方法是简单地创建一个新线程,进行无限循环,send() GPS 信息,sleep() 1 秒,send() 极性信息,然后 sleep() 2 秒。这是解决这个问题的充分方法吗?抱歉,我是套接字编程新手,所以我不知道有任何替代方法。

最佳答案

您提出的方案是:

send the GPS information, sleep for 1 second, send the polarity information, and then sleep for 2 seconds

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

  1. 全局定位系统; sleep 1
  2. 极性; sleep 1
  3. sleep 1
  4. 全局定位系统; sleep 1
  5. 极性; sleep 1
  6. sleep 1
  7. 全局定位系统; sleep 1
  8. 极性; sleep 1
  9. sleep 1
  10. 全局定位系统; sleep 1
  11. 极性; sleep 1
  12. sleep 1

这将发送 GPS 信息 4 次(正确)和极性 4 次,每 3 秒一次,而不是规范要求的 3 次每 4 秒一次。所需的顺序可能是:

  1. 全局定位系统;极性; sleep 1
  2. sleep 1
  3. sleep 1
  4. 全局定位系统; sleep 1
  5. 极性; sleep 1
  6. sleep 1
  7. 全局定位系统; sleep 1
  8. sleep 1
  9. 极性; sleep 1
  10. 全局定位系统; sleep 1
  11. sleep 1
  12. sleep 1

请注意,在某一秒内,必须发送 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 秒)。

如果您需要避免漂移(因为上面的代码假设发送过程是瞬时的,但事实并非如此),那么您必须使用亚秒级 sleep 并在循环开始时捕获时间并调整 sleep 间隔以留出发送所需的时间。

关于c - C语言中定期从客户端向服务器发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com