Esempio n. 1
0
LNE_NAMESPACE_USING

void TestClient()
{
	TimeValue tv(3);
	SockAddr addr("www.google.com:80");
	SockConnector *connector = SockConnector::NewInstance(addr, &tv);
	if(connector == NULL) {
		printf("connector cannot create\n");
		return;
	}
	SockPad skpad;
	if(connector->Connect(skpad) != LNERR_OK) {
		printf("connector cannot connect\n");
		connector->Release();
		return;
	}
	SockWaves *stream = SockWaves::NewInstance(skpad);
	const char *query = "GET / HTTP/1.1\r\n\r\n";
	DataBlock *block = DataBlock::NewInstance(1024 * 1024);
	strcpy(block->buffer(), query);
	block->set_size(static_cast<LNE_UINT>(strlen(block->buffer())));
	stream->Send(block);
	while(stream->Recv(block, tv) == LNERR_OK) {
		block->buffer()[block->size()] = '\0';
		puts(block->buffer());
	}
	block->Release();
	SockAddr addr_sock, addr_peer;
	stream->GetSockAddr(addr_sock);
	stream->GetPeerAddr(addr_peer);
	printf("connect %s => %s\n", addr_sock.addr_text(), addr_peer.addr_text());
	stream->Release();
	connector->Release();
}
Esempio n. 2
0
void DatabaseAdapter_DataBlock::Writer::store( DatabaseTransactionInterface* transaction, const DataBlock& blk)
{
	m_dbkey.resize( m_domainKeySize);
	m_dbkey.addElem( blk.id());
	transaction->write( m_dbkey.ptr(), m_dbkey.size(), blk.charptr(), blk.size());
}
Esempio n. 3
0
File: main.cpp Progetto: CCJY/coliru
 DataBlock(const DataBlock& rhs) :
     data_(std::malloc(rhs.size())),
     size_(rhs.size())
 {
     std::memcpy(data(), rhs.data(), size());
 }
Esempio n. 4
0
void SockSpray::__HandleRead(void)
{
	bool to_handle = true;
	// ignore when shutdown
	shutdown_lock_.Lock();
	if(shutdown_state_.already || shutdown_state_.query)
		to_handle = false;
	shutdown_lock_.Unlock();
	if(!to_handle)
		return;
	// lock recv process
	recv_lock_.Lock();
	if(recv_state_.already) {
		to_handle = false;
		recv_state_.ready = true;
	} else {
		recv_state_.ready = false;
		recv_state_.already = true;
	}
	recv_lock_.Unlock();
	if(!to_handle)
		return;
	ssize_t len;
	DataBlock *block;
	bool continue_recv = false, to_shutdown = false;
recv_data_next:
	do {
		block = pool_->Alloc();
		if(block == NULL)
			to_shutdown = true;
		else {
			do {
				len = recv(skpad_.socket(), block->buffer_free(), block->free_size(), 0);
				if(len > 0)
					block->set_size(block->size() + len);
#if defined(LNE_WIN32)
			} while(len > 0 && !block->IsFull());
#else
			}
			while((len > 0 && !block->IsFull()) || (len < 0 && errno == EINTR));
#endif
			if(len > 0)
				continue_recv = true;
#if defined(LNE_WIN32)
			else if(len == 0 || WSAGetLastError() != WSAEWOULDBLOCK)
#else
			else if(len == 0 || errno != EWOULDBLOCK)
#endif
				to_shutdown = true;
			else
				continue_recv = false;
			// process data
			if(!block->IsEmpty())
				handler_->HandleData(this, block);
			block->Release();
			if(continue_recv) {
				shutdown_lock_.Lock();
				if(shutdown_state_.query) {
					to_shutdown = true;
					continue_recv = false;
				}
				shutdown_lock_.Unlock();
			}
#if defined(LNE_WIN32)
			if(!continue_recv && !to_shutdown) {
				DWORD bytes, flags = 0;
				iocp_lock_.Lock();
				int rc = WSARecv(skpad_.socket(), &iocp_data_.buffer, 1, &bytes, &flags, &iocp_data_.overlap[IOCP_READ], NULL);
				if(rc == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING)
					to_shutdown = true;
				else
					++iocp_data_.count;
				iocp_lock_.Unlock();
			}
#endif
		}
	}
	while(continue_recv && !to_shutdown);
	// check shutdown
	shutdown_lock_.Lock();
	if(!shutdown_state_.already && to_shutdown)
		__Shutdown();
	shutdown_lock_.Unlock();
	// lock unlock process
	to_handle = false;
	recv_lock_.Lock();
	if(!recv_state_.ready || to_shutdown)
		recv_state_.already = false;
	else
	{
		to_handle = true;
		recv_state_.ready = false;
	}
	recv_lock_.Unlock();
	if(to_handle)
		goto recv_data_next;
}