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"); } }
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); } }