コード例 #1
0
ファイル: RpcClient.cpp プロジェクト: fankux/webc
bool RpcClient::invoke(const google::protobuf::MethodDescriptor* method, std::string& errmsg) {
    int service_id = method->service()->index();
    int method_id = method->index();
    procedure_id_t procedure_id = build_procedure_id(service_id, method_id);
    struct event* ev = RpcClient::_evs.get(procedure_id);
    struct timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = RpcClient::CONNECT_TIMEOUT * 1000;

    if (ev == NULL) {
        ev = event_info_create(create_tcpsocket());
        if (ev == NULL) {
            errmsg = "faild to alloc event info";
            error("faild to alloc event info, service id:%d, method id:%d", service_id, method_id);
            return false;
        }

        RpcClient::_evs.add(procedure_id, *ev);
        ev->flags = EVENT_REUSE | EVENT_WRITE;
        ev->fail_func = failed_callback;
        ev->fail_param = (void*) method;
        ev->send_func = invoke_callback;
        ev->send_param = (void*) method;

        if (!connect(ev, &timeout)) {
            errmsg = "invoke connect error";
            error("invoke connect error, service id:%d, method id:%d", service_id, method_id);
            return false;
        }
    } else {
        ev->flags = EVENT_REUSE | EVENT_WRITE;
        ev->send_func = invoke_callback;
        ev->send_param = (void*) method;
        if (ev->status == EVENT_STATUS_ERR) {
            warn("arragner lose connect, try to reconnect");
            ev->fd = create_tcpsocket();
            ev->status = EVENT_STATUS_OK;
            if (!connect(ev, &timeout)) {
                errmsg = "invoke reconnect error";
                return false;
            }
        } else {
            ev->status = EVENT_STATUS_OK;
            event_mod(_netinf, ev);
        }
    }
    return true;
}
コード例 #2
0
ファイル: mytcplib.cpp プロジェクト: kumagi/skip-graph
int connect_send(int* socket,const int ip,const unsigned short port,const char* buff,const size_t bufflen){
	*socket = create_tcpsocket();
	set_linger(*socket);
	connect_port_ip(*socket,ip,port);
	size_t postsend=0,tmpsend;
	while(postsend != bufflen){
		tmpsend = write(*socket,&buff[postsend],bufflen);
		if(tmpsend>0){
			postsend+=tmpsend;
		}else{
			return 0;
		}
	}
	return postsend;
}
コード例 #3
0
ファイル: mytcplib.cpp プロジェクト: kumagi/skip-graph
int connect_send_close(const int ip,const unsigned short port,const char* buff,const size_t bufflen){
	// return how many bytes sent
	int socket = create_tcpsocket();
	set_linger(socket);
	
	int success = connect_port_ip(socket,ip,port);
	if(success) {
		perror("connect");
		fprintf(stderr,"target:%s\n",my_ntoa(ip));
		exit(1);
		return 1;
	}
	size_t postsend=0,tmpsend;
	while(postsend != bufflen){
		tmpsend = write(socket,buff,bufflen);
		if(tmpsend>0){
			postsend+=tmpsend;
		}else{
			return postsend;
		}
	}
	close(socket);
	return postsend;
}
コード例 #4
0
ファイル: util_http.c プロジェクト: guoyu07/vfds
int http_get(char **res, char *url)
{
	if(url == NULL)
	{
		*res = NULL;
		return -1;
	}

	int fd;
	char host[256] = {0x0};
	char requestpath[1024] = {0x0};
	int port = 0;
	int ishttps = 0;
	int reslength = 0;
	int ressize = 0;

	
	int n, ret;
	SSL *ssl;
	SSL_CTX *ctx;
	
	char buf[BUF_LEN];
	
	//parse url
	parse_src(url, host, requestpath, &port, &ishttps);
	
	//create socket
	fd = create_tcpsocket(host, port, ishttps);
	if(fd < 0)
		return -1;
	
	/* http request. */
	sprintf(buf, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n",requestpath, host);
	
	if(ishttps != 1)
	{
		if(xnet_select(fd, timeout_sec, timeout_microsec, WRITE_STATUS) > 0)
		{
			/* send off the message */
			write(fd, buf, strlen(buf));
		}
		else
		{
			return -1;
		}
		while (xnet_select(fd, timeout_sec, timeout_microsec, READ_STATUS) > 0)
		{
			if ((n = read(fd, buf, BUF_LEN-1)) > 0) 
			{
				buf[n] = '\0';
				if(reslength == 0)
				{
					reslength += n;
					ressize = BUF_LEN;
					*res = malloc(ressize);
					memset(*res, 0, ressize);
					char *tmp;
					if((tmp = strstr(buf, "\r\n\r\n")) != NULL)
					{
						strcat(*res, tmp + 4);
					}
					else
						strcat(*res, buf);
				}
				else 
				{
					reslength += n;
					ressize += BUF_LEN;
					*res = realloc(*res, ressize);
					strcat(*res, buf);				
				}	
			}
			else
			{
				break;
			}
		}
		//close the plain socket handler.
		close(fd);
	}
	else
	{
		SSL_load_error_strings();
		SSL_library_init();
		ctx = SSL_CTX_new(SSLv23_client_method());
		if ( ctx == NULL )
		{
			return -1;
		}

		ssl = SSL_new(ctx);
		if ( ssl == NULL ){
			return -1;
		}

		ret = SSL_set_fd(ssl, fd);
		if ( ret == 0 ){
			return -1;
		}

		/* PRNG */
		RAND_poll();
		while ( RAND_status() == 0 )
		{
			unsigned short rand_ret = rand() % 65536;
			RAND_seed(&rand_ret, sizeof(rand_ret));
		}
		
		/* SSL Connect */
		ret = SSL_connect(ssl);
		if( ret != 1 ){
			return -1;
		}

		//https socket write.
		SSL_write(ssl, buf, strlen(buf));
		while((n = SSL_read(ssl, buf, BUF_LEN-1)) > 0)
		{	
			buf[n] = '\0';
			if(reslength == 0)
			{
				reslength += n;
				ressize = BUF_LEN;
				*res = malloc(ressize);
				memset(*res, 0, ressize);
				char *tmp;
				if((tmp = strstr(buf, "\r\n\r\n")) != NULL)
				{
					strcat(*res, tmp + 4);
				}
				else
					strcat(*res, buf);
			}
			else 
			{
				reslength += n;
				ressize += BUF_LEN;
				*res = realloc(*res, ressize);
				strcat(*res, buf);				
			}	

		}
		
		if(n != 0)
		{
			return -1;
		}

		//close ssl tunnel.
		ret = SSL_shutdown(ssl);
		//if( ret != 1 ){
		//	usleep(10000);
		//	ret = SSL_shutdown(ssl);
		//	if(ret != 1)
		//	{
		//		close(fd);
		//		return -1;
		//	}
		//}

		//close the plain socket handler.
		close(fd);

		//clear ssl resource.
		SSL_free(ssl); 

		SSL_CTX_free(ctx);
		ERR_free_strings();
	}
	return 0;
}