Esempio n. 1
0
	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);
    }
Esempio n. 2
0
	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);
    }
Esempio n. 3
0
    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

    }