139 lines
3.7 KiB
C
139 lines
3.7 KiB
C
#include <getopt.h>
|
|
#include <easy_io.h>
|
|
#include <easy_time.h>
|
|
#include "easy_kfc_handler.h"
|
|
|
|
/*************************************************************************************************
|
|
* 函数定义部分
|
|
*************************************************************************************************/
|
|
#define DATA_LEN 128
|
|
easy_atomic_t process_cnt = 0;
|
|
|
|
static int server_process(easy_request_t *r)
|
|
{
|
|
easy_kfc_packet_t *ipacket = (easy_kfc_packet_t *)r->ipacket;
|
|
easy_kfc_packet_t *opacket;
|
|
|
|
opacket = easy_kfc_packet_rnew(r, ipacket->len);
|
|
memcpy(opacket->data, ipacket->data, ipacket->len);
|
|
*((uint64_t *)opacket->data) = ipacket->chid;
|
|
opacket->len = ipacket->len;
|
|
opacket->chid = ipacket->chid;
|
|
r->opacket = opacket;
|
|
|
|
return EASY_OK;
|
|
}
|
|
|
|
void do_server(easy_kfc_t *kfc)
|
|
{
|
|
if (easy_kfc_join_server(kfc, "test2", server_process) == EASY_OK) {
|
|
easy_kfc_allow_client(kfc, "test2", "*", 1);
|
|
easy_kfc_start(kfc);
|
|
}
|
|
}
|
|
|
|
void *do_client(void *args)
|
|
{
|
|
easy_kfc_t *kfc = (easy_kfc_t *)args;
|
|
easy_kfc_agent_t *ka = easy_kfc_join_client(kfc, "test2");
|
|
|
|
if (ka == NULL) {
|
|
easy_error_log("easy_kfc_join_client is failure.");
|
|
return (void *)NULL;
|
|
}
|
|
|
|
easy_kfc_choice_scheduler(ka, EASY_KFC_CHOICE_RT);
|
|
char data1[DATA_LEN];
|
|
char data2[DATA_LEN];
|
|
memset(data1, 'A', DATA_LEN);
|
|
|
|
while(kfc->eio->stoped == 0) {
|
|
if (easy_kfc_send_message(ka, data1, DATA_LEN, 1000) == EASY_OK)
|
|
if (easy_kfc_recv_message(ka, data2, DATA_LEN) > 0)
|
|
easy_atomic_inc(&process_cnt);
|
|
}
|
|
|
|
easy_kfc_leave_client(ka);
|
|
return (void *)NULL;
|
|
}
|
|
|
|
void *do_stat(void *args)
|
|
{
|
|
easy_kfc_t *kfc = (easy_kfc_t *)args;
|
|
int64_t e, s = easy_time_now();
|
|
double lastspeed = 0.0;
|
|
uint64_t lastcnt = 0, cnt;
|
|
|
|
while(kfc->eio->stoped == 0) {
|
|
sleep(1);
|
|
e = easy_time_now();
|
|
cnt = process_cnt;
|
|
double speed = (lastspeed + (cnt - lastcnt) * 1000000 / (e - s)) / 2;
|
|
fprintf(stderr, "QPS: %.2f\n", speed);
|
|
lastspeed = speed;
|
|
s = e;
|
|
lastcnt = cnt;
|
|
}
|
|
|
|
return (void *)NULL;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
char config[256];
|
|
char buffer[64];
|
|
easy_kfc_t *kfc;
|
|
int i, cnt;
|
|
uint64_t address[16];
|
|
easy_addr_t addr;
|
|
|
|
if (argc != 2) {
|
|
fprintf(stderr, "%s server|client_cnt\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
// config
|
|
cnt = easy_inet_hostaddr(address, 16, 0);
|
|
memset(&addr, 0, sizeof(addr));
|
|
|
|
for(i = 0; i < cnt; i++) {
|
|
easy_inet_atoe(&address[i], &addr);
|
|
easy_inet_addr_to_str(&addr, buffer, 64);
|
|
lnprintf(config, 256, "%s role=server group=test2 port=2200\n"
|
|
"%s role=client group=test2 port=2200\n", buffer, buffer);
|
|
}
|
|
|
|
// server
|
|
if (strcmp(argv[1], "server") == 0) {
|
|
kfc = easy_kfc_create(config, 0);
|
|
do_server(kfc);
|
|
} else {
|
|
kfc = easy_kfc_create(config, 1);
|
|
easy_kfc_start(kfc);
|
|
|
|
cnt = atoi(argv[1]);
|
|
|
|
if (cnt <= 0) cnt = 1;
|
|
|
|
pthread_t tids[cnt + 1];
|
|
|
|
for(i = 0; i < cnt; i++) {
|
|
pthread_create(&tids[i], NULL, do_client, kfc);
|
|
}
|
|
|
|
pthread_create(&tids[i], NULL, do_stat, kfc);
|
|
|
|
for(i = 0; i < cnt; i++) {
|
|
pthread_join(tids[i], NULL);
|
|
}
|
|
|
|
easy_eio_stop(kfc->eio);
|
|
pthread_join(tids[cnt], NULL);
|
|
}
|
|
|
|
easy_kfc_wait(kfc);
|
|
easy_kfc_destroy(kfc);
|
|
|
|
return 0;
|
|
}
|