Home --> Documentations --> PJLIB Reference
This file is pjlib-test/activesock.c
#include "test.h"
#include <pjlib.h>
#if INCLUDE_ACTIVESOCK_TEST
#define THIS_FILE "activesock.c"
{
unsigned rx_cnt;
unsigned rx_err_cnt, tx_err_cnt;
};
static void udp_echo_err( const char *title, pj_status_t status)
{
PJ_LOG(3,(THIS_FILE, " error: %s: %s", title, errmsg));
}
void *data,
int addr_len,
{
srv->status = status;
srv->rx_err_cnt++;
udp_echo_err("recvfrom() callback", status);
}
srv->rx_cnt++;
if (srv->echo_enabled) {
sent = size;
&sent, 0,
src_addr, addr_len);
srv->tx_err_cnt++;
udp_echo_err("sendto()", status);
}
}
}
{
srv->echo_enabled = enable_echo;
pj_bzero(&activesock_cb, sizeof(activesock_cb));
srv, &srv->asock, &addr);
udp_echo_err("pj_activesock_create()", status);
return status;
}
udp_echo_err("pj_activesock_start_recvfrom()", status);
return status;
}
*p_srv = srv;
}
{
}
static int udp_ping_pong_test(void)
{
unsigned data = 0;
int count, ret;
if (!pool)
return -10;
ret = -20;
udp_echo_err("pj_ioqueue_create()", status);
goto on_return;
}
status = udp_echo_srv_create(pool, ioqueue, PJ_TRUE, &srv1);
ret = -30;
goto on_return;
}
status = udp_echo_srv_create(pool, ioqueue, PJ_TRUE, &srv2);
ret = -40;
goto on_return;
}
for (count=0; count<1000; ++count) {
unsigned last_rx1, last_rx2;
unsigned i;
if (need_send) {
++data;
sent = sizeof(data);
loopback = pj_str( "127.0.0.1");
&data, &sent, 0,
&addr, sizeof(addr));
ret = -50;
udp_echo_err("sendto()", status);
goto on_return;
}
}
last_rx1 = srv1->rx_cnt;
last_rx2 = srv2->rx_cnt;
for (i=0; i<10 && last_rx1 == srv1->rx_cnt && last_rx2 == srv2->rx_cnt; ++i) {
#ifdef PJ_SYMBIAN
#else
#endif
}
if (srv1->rx_err_cnt+srv1->tx_err_cnt != 0 ||
srv2->rx_err_cnt+srv2->tx_err_cnt != 0)
{
ret = -60;
goto on_return;
}
if (last_rx1 == srv1->rx_cnt && last_rx2 == srv2->rx_cnt) {
ret = -70;
goto on_return;
}
}
ret = 0;
on_return:
if (srv2)
udp_echo_srv_destroy(srv2);
if (srv1)
udp_echo_srv_destroy(srv1);
if (ioqueue)
if (pool)
return ret;
}
#define SIGNATURE 0xdeadbeef
{
char fill[513];
};
{
};
{
};
void *data,
{
char *next = (char*) data;
PJ_LOG(1,( "", " err: status=%d", status));
}
while (size >= sizeof( struct tcp_pkt)) {
if ( tcp_pkt->signature != SIGNATURE) {
PJ_LOG(1,( "", " err: invalid signature at seq=%d",
st->next_recv_seq));
}
if ( tcp_pkt->seq != st->next_recv_seq) {
PJ_LOG(1,( "", " err: wrong sequence"));
}
st->next_recv_seq++;
}
if (size) {
*remainder = size;
}
}
{
st->sent = 1;
if (sent < 1) {
}
}
static int tcp_perf_test(void)
{
enum { COUNT=10000 };
unsigned i;
&sock2);
status = -100;
goto on_return;
}
status = -110;
goto on_return;
}
&cb, state1, &asock1);
status = -120;
goto on_return;
}
&cb, state2, &asock2);
status = -130;
goto on_return;
}
status = -140;
goto on_return;
}
for (i=0; i<COUNT && !state1->err && !state2->err; ++i) {
pkt = ( struct tcp_pkt*)state2->pkt;
pkt->signature = SIGNATURE;
pkt->seq = i;
pj_memset(pkt->fill, 'a', sizeof(pkt->fill));
len = sizeof(*pkt);
do {
#if PJ_SYMBIAN
#else
#endif
} while (!state2->sent);
} else {
#if PJ_SYMBIAN
#endif
PJ_LOG(1,( "", " err: send status=%d", status));
status = -180;
break;
if (len != sizeof(*pkt)) {
PJ_LOG(1,( "", " err: shouldn't report partial sent"));
status = -190;
break;
}
}
}
#ifndef PJ_SYMBIAN
for (;;) {
break;
}
#endif
}
if (state1->next_recv_seq < COUNT) {
#ifdef PJ_SYMBIAN
;
#else
;
#endif
}
if (status != 0)
goto on_return;
if (state1->err) {
status = -183;
goto on_return;
}
if (state2->err) {
status = -186;
goto on_return;
}
if (state1->next_recv_seq != COUNT) {
PJ_LOG(3,( "", " err: only %u packets received, expecting %u",
state1->next_recv_seq, COUNT));
status = -195;
goto on_return;
}
on_return:
if (asock2)
if (asock1)
if (ioqueue)
if (pool)
return status;
}
int activesock_test(void)
{
int ret;
PJ_LOG(3,( "", "..udp ping/pong test"));
ret = udp_ping_pong_test();
if (ret != 0)
return ret;
PJ_LOG(3,( "", "..tcp perf test"));
ret = tcp_perf_test();
if (ret != 0)
return ret;
return 0;
}
#else
int dummy_active_sock_test;
#endif
struct pj_activesock_t pj_activesock_t Definition: activesock.h:50
pj_status_t pj_activesock_sendto(pj_activesock_t *asock, pj_ioqueue_op_key_t *send_key, const void *data, pj_ssize_t *size, unsigned flags, const pj_sockaddr_t *addr, int addr_len)
pj_status_t pj_activesock_start_recvfrom(pj_activesock_t *asock, pj_pool_t *pool, unsigned buff_size, pj_uint32_t flags)
pj_status_t pj_activesock_send(pj_activesock_t *asock, pj_ioqueue_op_key_t *send_key, const void *data, pj_ssize_t *size, unsigned flags)
pj_status_t pj_activesock_create(pj_pool_t *pool, pj_sock_t sock, int sock_type, const pj_activesock_cfg *opt, pj_ioqueue_t *ioqueue, const pj_activesock_cb *cb, void *user_data, pj_activesock_t **p_asock)
void * pj_activesock_get_user_data(pj_activesock_t *asock)
pj_status_t pj_activesock_close(pj_activesock_t *asock)
pj_status_t pj_activesock_start_read(pj_activesock_t *asock, pj_pool_t *pool, unsigned buff_size, pj_uint32_t flags)
pj_status_t pj_activesock_create_udp(pj_pool_t *pool, const pj_sockaddr *addr, const pj_activesock_cfg *opt, pj_ioqueue_t *ioqueue, const pj_activesock_cb *cb, void *user_data, pj_activesock_t **p_asock, pj_sockaddr *bound_addr)
unsigned char pj_uint8_t Definition: types.h:55
long pj_ssize_t Definition: types.h:64
int pj_bool_t Definition: types.h:71
struct pj_ioqueue_t pj_ioqueue_t Definition: types.h:210
unsigned short pj_uint16_t Definition: types.h:49
long pj_sock_t Definition: types.h:263
size_t pj_size_t Definition: types.h:58
void pj_sockaddr_t Definition: types.h:267
int pj_status_t Definition: types.h:68
unsigned int pj_uint32_t Definition: types.h:43
@ PJ_SUCCESS Definition: types.h:93
@ PJ_TRUE Definition: types.h:96
@ PJ_FALSE Definition: types.h:99
void pj_ioqueue_op_key_init(pj_ioqueue_op_key_t *op_key, pj_size_t size)
pj_status_t pj_ioqueue_destroy(pj_ioqueue_t *ioque)
pj_status_t pj_ioqueue_create(pj_pool_t *pool, pj_size_t max_fd, pj_ioqueue_t **ioqueue)
int pj_ioqueue_poll(pj_ioqueue_t *ioque, const pj_time_val *timeout)
#define PJ_LOG(level, arg) Definition: log.h:106
#define PJ_POOL_ZALLOC_T(pool, type) Definition: pool.h:519
pj_pool_t * pj_pool_create(pj_pool_factory *factory, const char *name, pj_size_t initial_size, pj_size_t increment_size, pj_pool_callback *callback)
void pj_pool_release(pj_pool_t *pool)
pj_str_t pj_str(char *str)
void * pj_memmove(void *dst, const void *src, pj_size_t size) Definition: string.h:809
void * pj_memset(void *dst, int c, pj_size_t size) Definition: string.h:781
void pj_bzero(void *dst, pj_size_t size) Definition: string.h:762
pj_status_t pj_sock_close(pj_sock_t sockfd)
pj_uint16_t pj_ntohs(pj_uint16_t netshort)
#define pj_AF_INET() Definition: sock.h:113
#define PJ_INVALID_SOCKET Definition: sock.h:485
#define pj_SOCK_STREAM() Definition: sock.h:160
pj_status_t pj_sockaddr_in_init(pj_sockaddr_in *addr, const pj_str_t *cp, pj_uint16_t port)
pj_bool_t pj_symbianos_poll(int priority, int ms_timeout)
#define PJ_UNUSED_ARG(arg) Definition: config.h:1343
#define PJ_ERR_MSG_SIZE Definition: errno.h:84
pj_str_t pj_strerror(pj_status_t statcode, char *buf, pj_size_t bufsize)
#define PJ_ETIMEDOUT Definition: errno.h:357
#define PJ_EPENDING Definition: errno.h:322
Definition: udp_echo_srv_ioqueue.c:27
Definition: activesock.h:56
pj_bool_t(* on_data_recvfrom)(pj_activesock_t *asock, void *data, pj_size_t size, const pj_sockaddr_t *src_addr, int addr_len, pj_status_t status) Definition: activesock.h:108
pj_bool_t(* on_data_sent)(pj_activesock_t *asock, pj_ioqueue_op_key_t *send_key, pj_ssize_t sent) Definition: activesock.h:128
pj_bool_t(* on_data_read)(pj_activesock_t *asock, void *data, pj_size_t size, pj_status_t status, pj_size_t *remainder) Definition: activesock.h:83
Definition: ioqueue.h:208
pj_uint16_t sin_port Definition: sock.h:541
Definition: activesock.c:270
Definition: activesock.c:255
Definition: activesock.c:262
Definition: activesock.c:39
pj_sockaddr_in ipv4 Definition: sock.h:635
PJLIB Open Source, high performance, small footprint, and very very portable framework
Copyright (C) 2006-2009 Teluu Inc.
|