view ping.c @ 3:5a977ccbc7a9 default tip

Empty changelog
author darius
date Sat, 06 Dec 1997 05:41:29 +0000
parents
children
line wrap: on
line source

/* $Id: ping.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */

/*
 * ping.c
 *
 */

#include "copyright2.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <math.h>
#include <errno.h>
#include "Wlib.h"
#include "defs.h"
#include "struct.h"
#include "data.h"
#include "packets.h"
#include "proto.h"

/* These are used only in pingstats.c */

int     ping_iloss_sc = 0;	/* inc % loss 0--100, server to client */
int     ping_iloss_cs = 0;	/* inc % loss 0--100, client to server */
int     ping_tloss_sc = 0;	/* total % loss 0--100, server to client */
int     ping_tloss_cs = 0;	/* total % loss 0--100, client to server */
int     ping_lag = 0;		/* delay in ms of last ping */
int     ping_av = 0;		/* rt time */
int     ping_sd = 0;		/* std deviation */

static int sum, n;
static int M, var;
static double s2;

void sendServerPingResponse P((int number));
void calc_lag P((void));

void
handlePing(packet)		/* SP_PING */
    struct ping_spacket *packet;
{
    ping = 1;			/* we got a ping */

/*
printf("ping received at %d (lag: %d)\n", msetime(), (int)packet->lag);
*/
    sendServerPingResponse((int) packet->number);
    ping_lag = ntohs(packet->lag);
    ping_iloss_sc = (int) packet->iloss_sc;
    ping_iloss_cs = (int) packet->iloss_cs;
    ping_tloss_sc = (int) packet->tloss_sc;
    ping_tloss_cs = (int) packet->tloss_cs;

    calc_lag();

    if (W_IsMapped(pStats))	/* pstat window */
	updatePStats();
}

void
startPing()
{
    static
    struct ping_cpacket packet;
    extern int serverDead;

    packet.type = CP_PING_RESPONSE;
    packet.pingme = 1;

    if (gwrite(sock, (char *) &packet, sizeof(struct ping_cpacket)) !=
	sizeof(struct ping_cpacket)) {
	printf("gwrite failed.\n");
	serverDead = 1;
    }
}

void
stopPing()
{
    static
    struct ping_cpacket packet;
    extern int serverDead;

    ping = 0;
    packet.type = CP_PING_RESPONSE;
    packet.pingme = 0;

    if (gwrite(sock, (char *) &packet, sizeof(struct ping_cpacket)) !=
	sizeof(struct ping_cpacket)) {
	printf("gwrite failed.\n");
	serverDead = 1;
    }
}

void
sendServerPingResponse(number)	/* CP_PING_RESPONSE */
    int     number;
{
    struct ping_cpacket packet;
    int     s;
    extern int serverDead;

    if (udpSock >= 0) {
	s = udpSock;
	packets_sent++;
    } else
	s = sock;

    packet.type = CP_PING_RESPONSE;
    packet.pingme = (char) ping;
    packet.number = (unsigned char) number;
    /* count this one */
    packet.cp_sent = htonl(packets_sent);
    packet.cp_recv = htonl(packets_received);

/*
printf("ping response sent at %d\n", msetime());
*/

    if (gwrite(s, (char *) &packet, sizeof(struct ping_cpacket)) !=
	sizeof(struct ping_cpacket)) {
	printf("gwrite failed.\n");
	serverDead = 1;
    }
}

void
calc_lag()
{
    /* probably ghostbusted */
    /* without this things can get really bad */
    if (ping_lag > 2000 || ping_lag == 0)
	return;

    n++;
    sum += ping_lag;
    s2 += (ping_lag * ping_lag);
    if (n == 1)
	return;

    M = sum / n;
    var = (s2 - M * sum) / (n - 1);

    ping_av = M;
    ping_sd = (int) sqrt((double) var);
}