#include "stdafx.h"
#include "util.h"
#include "thread_client.h"

thread_client::thread_client(const char* server_addr, bool keep_alive,
	int count, int length)
: server_addr_(server_addr)
, keep_alive_(keep_alive)
, count_(count)
, length_(length)
{
}

thread_client::~thread_client()
{
}

void* thread_client::run()
{
	acl::socket_stream conn;

	// 连接远程服务器
	if (conn.open(server_addr_, 10, 10) == false)
	{
		printf("connect %s error %s\r\n", server_addr_.c_str(),
			acl::last_serror());
		return NULL;
	}

	char* data = (char*) acl_mymalloc(length_);
	memset(data, 'X', length_);
	data[length_ - 1] = '\n';

	acl::string buf;

	struct timeval begin;
	gettimeofday(&begin, NULL);

	int   i = 0;
	for (; i < count_; i++)
	{
		// 向服务器写一行数据
		if (conn.write(data, length_) == -1)
		{
			printf("write to %s error %s\r\n",
				server_addr_.c_str(), acl::last_serror());
			break;
		}

		// 从服务器读一行数据
		if (conn.gets(buf) == false)
		{
			printf("gets from %s error %s\r\n",
				server_addr_.c_str(), acl::last_serror());
			break;
		}

		if (i % 1000 == 0)
		{
			buf.format("total: %d, curr: %d", count_, i);
			ACL_METER_TIME(buf.c_str());
		}

		if (keep_alive_)
			continue;

		// 如果采用短连接，则先关闭连接再打开连接
		conn.close();
		if (conn.open(server_addr_.c_str(), 10, 10) == false)
		{
			printf("connect %s error %s\r\n", server_addr_.c_str(),
				acl::last_serror());
			break;
		}
	}

	struct timeval end;
	gettimeofday(&end, NULL);
	double spent = util::stamp_sub(&end, &begin);
	printf("total: %d, curr: %d, spent: %.2f, speed: %.2f\r\n",
		count_, i, spent, (i * 1000) / (spent > 1 ? spent : 1));

	acl_myfree(data);
	return NULL;
}
