~netrek-developers/netrek-client-cow/trunk

« back to all changes in this revision

Viewing changes to _darcs/pristine/ping.c

  • Committer: Collin Pruitt
  • Date: 2009-05-12 04:30:09 UTC
  • Revision ID: collinp111@gmail.com-20090512043009-3jsjojoyrk16oass
Initial upload - updated from http://james.tooraweenah.com/darcs/netrek-client-cow/ using darcs (hince the existnace of _darcs), fully patched.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ping.c
 
2
 */
 
3
#include "config.h"
 
4
#include "copyright2.h"
 
5
 
 
6
#include <stdio.h>
 
7
#include <sys/types.h>
 
8
#include INC_NETINET_IN
 
9
#include <sys/time.h>
 
10
#include <math.h>
 
11
#include <errno.h>
 
12
 
 
13
#include "Wlib.h"
 
14
#include "defs.h"
 
15
#include "struct.h"
 
16
#include "data.h"
 
17
#include "packets.h"
 
18
 
 
19
#include "pingstats.h"
 
20
#include "socket.h"
 
21
 
 
22
#include "ping.h"
 
23
 
 
24
/* These are used only in pingstats.c */
 
25
 
 
26
int     ping_iloss_sc = 0;                       /* inc % loss 0--100, server
 
27
 
 
28
                                                  * 
 
29
                                                  * * * to client */
 
30
int     ping_iloss_cs = 0;                       /* inc % loss 0--100, client
 
31
 
 
32
                                                  * 
 
33
                                                  * * * to server */
 
34
int     ping_tloss_sc = 0;                       /* total % loss 0--100, *
 
35
 
 
36
                                                  * 
 
37
                                                  * * server to client */
 
38
int     ping_tloss_cs = 0;                       /* total % loss 0--100, *
 
39
 
 
40
                                                  * 
 
41
                                                  * * client to server */
 
42
int     ping_lag = 0;                            /* delay in ms of last ping */
 
43
int     ping_av = 0;                             /* rt time */
 
44
int     ping_sd = 0;                             /* std deviation */
 
45
 
 
46
static int sum, n;
 
47
static int M, var;
 
48
static double s2;
 
49
 
 
50
static void sendServerPingResponse(int number);
 
51
static void calc_lag(void);
 
52
 
 
53
void    handlePing(struct ping_spacket *packet)  /* SP_PING */
 
54
{
 
55
  ping = 1;                                      /* we got a ping */
 
56
 
 
57
  /* printf("ping received at %d (lag: %d)\n", msetime(), (int)packet->lag); */
 
58
  sendServerPingResponse((int) packet->number);
 
59
  ping_lag = ntohs(packet->lag);
 
60
  ping_iloss_sc = (int) packet->iloss_sc;
 
61
  ping_iloss_cs = (int) packet->iloss_cs;
 
62
  ping_tloss_sc = (int) packet->tloss_sc;
 
63
  ping_tloss_cs = (int) packet->tloss_cs;
 
64
 
 
65
  calc_lag();
 
66
 
 
67
  if (W_IsMapped(pStats))                        /* pstat window */
 
68
    updatePStats();
 
69
}
 
70
 
 
71
void startPing(void)
 
72
{
 
73
  static
 
74
  struct ping_cpacket packet;
 
75
  extern int serverDead;
 
76
 
 
77
  packet.type = CP_PING_RESPONSE;
 
78
  packet.pingme = 1;
 
79
 
 
80
  if (gwrite(sock, (char *) &packet, sizeof(struct ping_cpacket)) !=
 
81
      sizeof  (struct ping_cpacket))
 
82
    {
 
83
      printf("gwrite failed.\n");
 
84
      serverDead = 1;
 
85
    }
 
86
}
 
87
 
 
88
void stopPing(void)
 
89
{
 
90
  static
 
91
  struct ping_cpacket packet;
 
92
  extern int serverDead;
 
93
 
 
94
  packet.type = CP_PING_RESPONSE;
 
95
  packet.pingme = 0;
 
96
 
 
97
  if (gwrite(sock, (char *) &packet, sizeof(struct ping_cpacket)) !=
 
98
      sizeof  (struct ping_cpacket))
 
99
    {
 
100
      printf("gwrite failed.\n");
 
101
      serverDead = 1;
 
102
    }
 
103
}
 
104
 
 
105
 
 
106
static void sendServerPingResponse(int number)           /* CP_PING_RESPONSE */
 
107
{
 
108
  struct ping_cpacket packet;
 
109
  int     s;
 
110
  extern int serverDead;
 
111
 
 
112
  if (udpSock >= 0)
 
113
    {
 
114
      s = udpSock;
 
115
      packets_sent++;
 
116
    }
 
117
  else
 
118
    s = sock;
 
119
 
 
120
  bzero(&packet, sizeof(packet));
 
121
  packet.type = CP_PING_RESPONSE;
 
122
  packet.pingme = (char) ping;
 
123
  packet.number = (unsigned char) number;
 
124
  /* count this one */
 
125
  packet.cp_sent = htonl(packets_sent);
 
126
  packet.cp_recv = htonl(packets_received);
 
127
 
 
128
  /* printf("ping response sent at %d\n", msetime()); */
 
129
 
 
130
  if (gwrite(s, (char *) &packet, sizeof(struct ping_cpacket)) !=
 
131
      sizeof  (struct ping_cpacket))
 
132
    {
 
133
      if (s == udpSock) {
 
134
        s = sock;
 
135
        if (gwrite(s, (char *) &packet, sizeof(struct ping_cpacket)) !=
 
136
            sizeof  (struct ping_cpacket))
 
137
          {
 
138
            serverDead = 1;
 
139
            printf("gwrite failed again.\n");
 
140
          }
 
141
      }
 
142
    }
 
143
}
 
144
 
 
145
static void calc_lag(void)
 
146
{
 
147
 
 
148
#ifdef nodef
 
149
  /* probably ghostbusted */
 
150
  if (ping_lag > 2000 || ping_lag == 0)
 
151
    return;
 
152
#endif
 
153
 
 
154
  n++;
 
155
  sum += ping_lag;
 
156
  s2 += (ping_lag * ping_lag);
 
157
  if (n == 1)
 
158
    return;
 
159
 
 
160
  M = sum / n;
 
161
  var = (s2 - M * sum) / (n - 1);
 
162
 
 
163
  ping_av = M;
 
164
  ping_sd = (int) sqrt((double) var);
 
165
}