throughput/main.c

1
#include <string.h>
2
#include <math.h>
3
#include <stdlib.h>
4
#include <time.h>
5
 
6
#include <strophe.h>
7
 
8
 
9
xmpp_conn_t *conn1, *conn2;
10
 
11
unsigned long mincount, maxcount;
12
unsigned long count = 0;
13
 
14
unsigned long sum_squares = 0;
15
unsigned long samples = 0; /* Current number of samples taken */
16
unsigned long discard_samples = 5;
17
unsigned long max_samples = 20; /* The number of samples to do, if specified by user */
18
 
19
time_t lasttime; /* Time of the last sample we took */
20
 
21
char* jid1 = "test1@localhost";
22
char* jid2 = "test2@localhost";
23
char* pass1 = "test";
24
char* pass2 = "test";
25
 
26
xmpp_stanza_t *bstanza;
27
 
28
int message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata)
29
{
30
	xmpp_ctx_t *ctx = (xmpp_ctx_t*)userdata;
31
	
32
	if(!xmpp_stanza_get_child_by_name(stanza, "body")) return 1;
33
	if(!strcmp(xmpp_stanza_get_attribute(stanza, "type"), "error")) return 1;
34
 
35
	if(conn == conn2)
36
	{
37
		count++;
38
		if(time(NULL) != lasttime)
39
		{
40
			if(lasttime > 0)
41
			{
42
				printf("%ld stanzas/sec\n", count);
43
				if(count > maxcount)
44
				{
45
					printf("%ld beats old maximum of %ld\n", count, maxcount);
46
					maxcount = count;
47
				}
48
				if(samples >= discard_samples)
49
					sum_squares += count*count;
50
				samples++;
51
				if(samples >= max_samples)
52
				{
53
					printf("----\nMax: %ld\nRMS: %.2Lf\n----\n", 
54
						maxcount,
55
						sqrtl(sum_squares/(samples-discard_samples))
56
					);
57
					xmpp_stop(ctx);
58
					return 0;
59
				}
60
			}
61
			count = 0;
62
			lasttime = time(NULL);
63
		}
64
		xmpp_send(conn1, bstanza);
65
		//fprintf(stderr, "C: %d\n", count);
66
	}
67
 
68
	return 1;
69
}
70
 
71
/* define a handler for connection events */
72
void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, 
73
		  const int error, xmpp_stream_error_t * const stream_error,
74
		  void * const userdata)
75
{
76
    xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
77
 
78
    if (status == XMPP_CONN_CONNECT) {
79
	xmpp_stanza_t* pres;
80
	fprintf(stderr, "DEBUG: connected\n");
81
	xmpp_handler_add(conn,message_handler, NULL, "message", NULL, ctx);
82
	
83
	/* Send initial <presence/> so that we appear online to contacts */
84
	pres = xmpp_stanza_new(ctx);
85
	xmpp_stanza_set_name(pres, "presence");
86
	xmpp_send(conn, pres);
87
	xmpp_stanza_release(pres);
88
	
89
	if(conn == conn2) 
90
	{
91
		count = 0;
92
		lasttime = 0;
93
		
94
		xmpp_send(conn1, bstanza);
95
	}
96
    }
97
    else {
98
	fprintf(stderr, "DEBUG: disconnected\n");
99
	xmpp_stop(ctx);
100
    }
101
}
102
 
103
int main(int argc, char *argv[])
104
{
105
    xmpp_ctx_t *ctx;
106
    xmpp_log_t *log = NULL;
107
    xmpp_stanza_t *body, *text;
108
 
109
    printf("Loading...\n");
110
    /* init library */
111
    xmpp_initialize();
112
 
113
    /* create a context */
114
#ifdef LOGGING
115
    	log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); /* pass NULL instead to silence output */
116
#endif
117
    ctx = xmpp_ctx_new(NULL, log);
118
 
119
    /* create a connection */
120
    conn1 = xmpp_conn_new(ctx);
121
    conn2 = xmpp_conn_new(ctx);
122
 
123
    /* setup authentication information */
124
    xmpp_conn_set_jid(conn1, jid1);
125
    xmpp_conn_set_pass(conn1, pass1);
126
 
127
    xmpp_conn_set_jid(conn2, jid2);
128
    xmpp_conn_set_pass(conn2, pass2);
129
 
130
 
131
	bstanza = xmpp_stanza_new(ctx);
132
	xmpp_stanza_set_name(bstanza, "message");
133
	xmpp_stanza_set_type(bstanza, "chat");
134
	xmpp_stanza_set_attribute(bstanza, "to", jid2);
135
 
136
	body = xmpp_stanza_new(ctx);
137
	xmpp_stanza_set_name(body, "body");
138
 
139
	text = xmpp_stanza_new(ctx);
140
	xmpp_stanza_set_text(text, "Hello");
141
	xmpp_stanza_add_child(body, text);
142
	xmpp_stanza_add_child(bstanza, body);
143
	
144
	xmpp_stanza_release(text);
145
	xmpp_stanza_release(body);
146
 
147
    /* initiate connection */
148
    xmpp_connect_client(conn1, "localhost", 5222, conn_handler, ctx);
149
    xmpp_connect_client(conn2, "localhost", 5222, conn_handler, ctx);
150
 
151
    printf("Connecting...\n");
152
    /* enter the event loop - 
153
       our connect handler will trigger an exit */
154
    xmpp_run(ctx);
155
 
156
    /* release our connection and context */
157
    xmpp_conn_release(conn1);
158
    xmpp_conn_release(conn2);
159
    xmpp_ctx_free(ctx);
160
 
161
    /* final shutdown of the library */
162
    xmpp_shutdown();
163
 
164
    return 0;
165
}