Esempio n. 1
0
void enableRead( evutil_socket_t sock, short flags, void * args )
{
	Reactor* reactor = (Reactor*)args;
	std::string addr = reactor->findaddrbysock(sock);
	Channel_var mychannel = reactor->mChannelTable->getChannel(addr);
	ByteBuffer_var readBuf = mychannel->getReadBuffer();
	printf("capacity %d, size %d\n", readBuf->Capacity(), readBuf->Size());
	int ret = 0;
	int offset = readBuf->Size();
	while((ret = recv(sock, readBuf->Inout() + offset, readBuf->Capacity(), 0)) > 0) {
		offset += ret;
	}
	ret = offset - readBuf->Size();
	readBuf->Size(offset);
	
	if(ret > 0)
	{
		mychannel->setTimestamp();
		while(1) {
			printf("sock %d, ret %d\n", sock, ret);
			int length = readBuf->getInt();
			int headerlength = readBuf->getInt();
			printf("length %d, headerlength %d\n", length, headerlength);
			readBuf->adjustReadpos(-8);
			if(!readBuf->isFullPackage(length+4)) {
				return (void)0;
			}

			readBuf->adjustReadpos(8);
			Byte_var headerdata = new Byte(headerlength+1);
			headerdata->setBuffer(readBuf->getBytes(headerlength), headerlength);
			RemotingCommand_var responseFuture = RemotingCommand::decode(headerdata->getBuffer());
			printf("header %s\n", headerdata->getBuffer());

			Byte_var bodydata = new Byte(length-4-headerlength);
			bodydata->setBuffer(readBuf->getBytes(length-4-headerlength), length-4-headerlength);
			
			responseFuture->setBody(Byte_var::Duplicate(bodydata));
			printf("body length %d\n", responseFuture->getBody()->size());
			
			reactor->setResponse(RemotingCommand_var::Duplicate(responseFuture));
			if(responseFuture->getCode() != 40) {
				reactor->notifyWorker(responseFuture->getOpaque());
			}
			else {
			}
			ret -= length+4;
			if(ret <= 0)
				break;
		}
		readBuf->Reset();
	}
	else
	{
		//连接断开
		printf("server closed\n");
	}
}
Esempio n. 2
0
void enableWrite(evutil_socket_t sock, short flags, void * args)
{
	Reactor* reactor = (Reactor*)args;
	std::string addr = reactor->findaddrbysock(sock);
	//向对应的socket发送 连接成功可以发送信号
	//对应的channel处在未连接状态,所以这个异步事件为判断connect成功
	//此处应删除可写事件,防止再次触发
	Channel_var mychannel = reactor->mChannelTable->getChannel(addr);
	if(!mychannel->IsRunOutOfTime(3)) {
		//成功连接上
		mychannel->setTimestamp();
		mychannel->setState(CHANNEL_CONNECTED);
		reactor->addReadable(mychannel->getSocket());
		std::cout << "catch writable" << std::endl;
		reactor->notifyChannel(sock);
	}
	else {
		//等待超时
		mychannel->setState(CHANNEL_ERROR);
		std::cout << "run out of time" << std::endl;
		reactor->notifyChannel(sock);
	}
}