2014-12-07 6 views
0

2 세트의 데이터를 서버에 주기적으로 보내야하는 멀티 스레드 소켓 프로그램을 만들고 있습니다. 클라이언트는 매 3 초마다 GPS 정보를 전송하고 매 4 초마다 극성 정보를 전송해야합니다. 이것을 구현하는 것에 대한 나의 생각은 새로운 스레드를 만들고, 무한 루프를 만들고, GPS 정보를 보내고, sleep()을 1 초 동안 보내고, 극성 정보를 보내고 (2 초 동안) sleep()하는 것입니다. 이것이 이것에 관해 갈 수있는 충분한 방법일까요? 죄송합니다. 소켓 프로그래밍을 처음 접해서 다른 방법을 모릅니다.C에서 클라이언트에서 서버로 주기적으로 데이터 보내기

+1

프로그램이 다중 스레드되어야하는 이유는 없습니다. 귀하의 솔루션이 합리적인 것 같습니다. –

+0

이것은 4 초마다가 아니라 3 초마다 극성 정보를 전송합니다. 아니; 그것은 사양을 충족하지 않습니다. 쓰래드를 전혀 사용하지 않는다고 가정 할 때, 두 개의 쓰레드를 사용한다. 하나는 3 초 대기 상태이고, 다른 하나는 4 초 대기 상태이다. 뮤텍스가있는 소켓에 대한 액세스를 조정하여 12 초의 배수에서 여전히 정상적인 동작을 얻습니다. 그러나 적절한 간격을 기다리는 단일 스레드 프로세스로 모든 작업을 수행 할 수 있습니다. 둘 다 전송 한 후, 3 자고, GPS를 보내고, 1은 잠자기, 2는 잔다, 2는 잔다, 2는 잔다, 극성을 보내고, 1은 잔다, GPS는 보내고, 3은 잔다. –

+0

'send'는 모든 데이터를 한꺼번에 보낼 수 없으므로 각각의'send' 주위에 루프가 필요합니다. – alain

답변

1

귀하의 제안 된 방법은 다음과 같습니다

2 초 12초의 기간 동안

동안 잠 후, 1 초 동안 GPS 정보, 잠을 보내 극성 정보를 전송하고 있음 리드 :

  1. GPS; 수면 1
  2. 극성; 수면 1
  3. 수면 1
  4. GPS; 수면 1
  5. 극성; 수면 1
  6. 수면 1
  7. GPS; 수면 1
  8. 극성; 수면 1
  9. 수면 1
  10. GPS; 수면 1
  11. 극성; 규격의 요구에 따라 슬립 1
  12. 슬립 1

이것은 GPS 정보가 4 번 (올바른)과 극성을 4 시간, 3 초마다가 아니라 3 회 및 4 초마다 전송한다. 원하는 시퀀스는 다음과 같을 수 있습니다 :

  1. GPS; 극성; 수면 1
  2. 잠 1
  3. 잠 1
  4. GPS; 수면 1
  5. 극성; 수면 1
  6. 수면 1
  7. GPS; 수면 1
  8. 수면 1
  9. 극성; 수면 1
  10. GPS; 몇 초, 두 GPS 극성이 전송되어야한다는 슬립 1
  11. 슬립 1
  12. 슬립 1

참고.

두 가지 방법 중 하나로이 문제를 해결할 수 있습니다. 쓰래드를 전혀 사용하지 않는다고 가정 할 때, 두 개의 쓰레드를 사용한다. 하나는 3 초 대기 상태이고, 다른 하나는 4 초 대기 상태이다. 뮤텍스가있는 소켓에 대한 액세스를 조정하여 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 초만 사용하는 것이 아니라) 씩 증가시킵니다.

드리프트가 발생하지 않도록하려면 (위의 코드는 전송 프로세스가 순간적이며 그렇지 않은 것으로 가정하기 때문에) 잠시 초를 사용하고 루프 시작 부분에서 시간을 트래핑하고 조정해야합니다 수면 간격은 보내는 데 걸리는 시간을 허용합니다.

+0

고맙습니다,이 점을 이해합니다. 그러나 GPS는 3 초이고 극성은 4 초입니다. gps와 극성 간격이 다른 임의의 값인 경우이를 구현하는 방법을 생각하는 데 어려움이 있습니다. – marcusc

+0

필자가 보여준 코드는 유효한 정수의 범위를 제외하고는 간격 ('i_gap'과'i_pol')에 임의의 값을 적용 할 수 있습니다. 또한 약간의주의와 일부 함수 포인터를 사용하여 임의의 수의 메시지 유형을 처리하도록 일반화 할 수 있습니다. 4 초와 8 초의 간격이 있다면 조금 더 세게 생각해야하지만, 8 초 작업을 원할 때 4 초 작업을 0, 4, 8, 12, 16, 20, ...에 수행하려고합니다. 2, 10, 18, ...에서 발생합니다. –

관련 문제