SharedPointer<ConnInfo> BaseProxy::create_Conn(){ SharedPointer<bgcc::ClientSocket> client = SharedPointer<bgcc::ClientSocket>( new ClientSocket(_serverinfo.getIP(),_serverinfo.getPort())); if (client.is_valid()) { if(client->open()==0){ SharedPointer<BinaryProtocol> prot = SharedPointer<BinaryProtocol>(new bgcc::BinaryProtocol(client)); return SharedPointer<ConnInfo>(new ConnInfo(prot)); } } return SharedPointer<ConnInfo>(NULL); }
SharedPointer<ConnInfo> SSLBaseProxy::create_Conn(){ SharedPointer<bgcc::ClientSocket> client = SharedPointer<bgcc::SSLClientSocket>( new SSLClientSocket(_serverinfo.getIP(),_serverinfo.getPort())); if (client.is_valid()) { if(client->open()==0){ SharedPointer<BinaryProtocol> prot = SharedPointer<BinaryProtocol>(new bgcc::BinaryProtocol(client)); if(prot.is_valid()&& prot->getTransport().is_valid()){ int32_t tm=0; if(get_property(PROXY_SEND_TIMEOUT, tm)){ SocketTool::set_sndtimeout(prot->getTransport()->id(), tm); } if(get_property(PROXY_RECV_TIMEOUT, tm)){ SocketTool::set_rcvtimeout(prot->getTransport()->id(), tm); } } return SharedPointer<ConnInfo>(new ConnInfo(prot)); } } return SharedPointer<ConnInfo>(NULL); }
void* call_back_thread_func(void* param) { BGCC_TRACE("bgcc", "enroll self"); callback_thread_arg_t* arg = (callback_thread_arg_t*)param; std::string proxy_name = arg->proxy_name; std::string server_ip = arg->server_ip; int32_t server_port = arg->server_port; ServiceManager* service_manager = arg->service_manager; Semaphore* sema = arg->sema; SharedPointer<ClientSocket> connect; SharedPointer<BinaryProtocol> proto; #ifndef _WIN32 int32_t ep = epoll_create(1); struct epoll_event ee; struct epoll_event revents[1]; #endif RECON: sema->signal(); connect = SharedPointer<ClientSocket>( new(std::nothrow) ClientSocket(server_ip, server_port)); connect->open(); connect->set_recv_timeout(60*60*24*30); proto = SharedPointer<BinaryProtocol>( new(std::nothrow) BinaryProtocol(connect)); int32_t ret = 0; ret = proto->writeMessageBegin("bgcc::BaseProcessor_enroll", "__enroll", bgcc::CALL, 0); if (ret < 0) { bgcc::TimeUtil::safe_sleep_s(1); goto RECON; } ret = proto->writeString(proxy_name); if (ret < 0) { bgcc::TimeUtil::safe_sleep_s(1); goto RECON; } ret = proto->writeMessageEnd(); if (ret < 0) { bgcc::TimeUtil::safe_sleep_s(1); goto RECON; } #ifndef _WIN32 ee.data.fd = connect->get_socket(); ee.events = EPOLLIN; epoll_ctl(ep, EPOLL_CTL_ADD, connect->get_socket(), &ee); #endif while (true) { #ifndef _WIN32 int32_t nevent = epoll_wait(ep, revents, 1, -1); BGCC_TRACE("bgcc", "epoll_wait return %d", nevent); if (nevent >= 1) { #endif char buffer[BUFSIZ]; int32_t xxret; xxret = connect->read(buffer, 20); BGCC_TRACE("bgcc", "ret value read %d", xxret); if (0 != xxret) { #ifndef _WIN32 epoll_ctl(ep, EPOLL_CTL_DEL, connect->get_socket(), &ee); #endif bgcc::TimeUtil::safe_sleep_s(1); goto RECON; } int32_t body_len = (int32_t)ntohl(*(uint32_t*)(buffer +16)); BGCC_TRACE("bgcc", "body size %d", body_len); char body[BUFSIZ]; xxret = connect->read(body, body_len); BGCC_TRACE("bgcc", "body ret value read %d", xxret); if (0 != xxret) { #ifndef _WIN32 epoll_ctl(ep, EPOLL_CTL_DEL, connect->get_socket(), &ee); #endif bgcc::TimeUtil::safe_sleep_s(1); goto RECON; } int32_t processor_name_len = (int32_t)ntohl(*(uint32_t*)(body)); std::string processor_name(body + 4, processor_name_len); SharedPointer<IProcessor> processor = service_manager->get_service(processor_name); if (processor.is_valid()) { processor->process( body + 4 + processor_name_len, body_len - 4 - processor_name_len, proto); } /* added for handling unexist service*/ else { processor = service_manager->get_service("._baseservice_2012"); if (processor.is_valid()) { SharedPointer<BinaryProtocol> bp(new BinaryProtocol(SharedPointer<ITransport>(NULL))); bp->writeMessageBegin("xx", "__service_not_found", bgcc::CALL, 0); bp->writeInt32(0); bp->writeString("__service_not_found"); bp->writeBool(false); void* data = NULL; int32_t head_body_size; NBDataBuffer* db = bp->get_data_buffer(); db->get_data(&data, head_body_size); processor->process( (char*)data + 20 + 4 + 2, head_body_size - 20 - 4 - 2, proto); } } #ifndef _WIN32 } #endif } //#ifdef _WIN32 return NULL; //#endif }