예제 #1
0
/*
 * Create a TCP RPC client using non-blocking connect
 */
static CLIENT* create_tcp_client(struct conn_info *info)
{
	int fd;
	CLIENT *client;
	struct sockaddr_in addr;
	struct hostent *hp;
	int ret;

	if (info->proto->p_proto != IPPROTO_TCP)
		return NULL;

	memset(&addr, 0, sizeof(addr));

	hp = gethostbyname(info->host);
	if (!hp)
		return NULL;

	addr.sin_family = AF_INET;
	addr.sin_port = htons(info->port);
	memcpy(&addr.sin_addr.s_addr, hp->h_addr, hp->h_length);

	fd = socket(PF_INET, SOCK_STREAM, info->proto->p_proto);
	if (fd < 0)
		return NULL;

	ret = connect_nb(fd, &addr, &info->timeout);
	if (ret < 0)
		goto out_close;

	client = clnttcp_create(&addr,
				info->program, info->version, &fd,
				info->send_sz, info->recv_sz);
	if (!client)
		goto out_close;

	/* Close socket fd on destroy, as is default for rpcowned fds */
	if  (!clnt_control(client, CLSET_FD_CLOSE, NULL)) {
		clnt_destroy(client);
		goto out_close;
	}

	return client;

out_close:
	close(fd);
	return NULL;
}
예제 #2
0
파일: cnat.c 프로젝트: millken/zhuxianB30
s32 cnat_local_data_connect(struct cnat_global_data *global_data)
{

	s32 ret;
	struct sockaddr_in l_addr;

	global_data->d_sock[global_data->d_sock_i].local_sock = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == global_data->d_sock[global_data->d_sock_i].local_sock)
	{
		return ERROR_FAIL;
	}
	memset(&l_addr, 0, sizeof(l_addr));
	l_addr.sin_family = AF_INET;
	l_addr.sin_port = htons(CNAT_LOCAL_PORT);
	l_addr.sin_addr.s_addr = inet_addr(CNAT_LOCAL_IP);
	ret = connect_nb(global_data->d_sock[global_data->d_sock_i].local_sock, (struct sockaddr *)&l_addr, sizeof(l_addr), 5);
	if(0 == ret)
	{
		cnat_close_socket(global_data, global_data->d_sock[global_data->d_sock_i].local_sock);
		return ERROR_FAIL;
	}
	
	return ERROR_SUCCESS;
}
예제 #3
0
파일: cnat.c 프로젝트: millken/zhuxianB30
/*******************************************************************************
 函数名称  : cnat_data_connect
 功能描述  : 与数据通道建立连接并与本地连接
 输入参数  : 无
 输出参数  : 无
 返 回 值      : 无
------------------------------------------------------------
 最近一次修改记录 :
 修改作者   : 阮春博
 修改目的   : 新增函数
 修改日期   : 2012年3 月21 日
*******************************************************************************/
s32 cnat_umc_data_connect(struct cnat_global_data *global_data)
{
	s32 ret;
	struct sockaddr_in rl_addr;
	struct connect_iden conn_iden;
	memset(&conn_iden, 0, sizeof(struct connect_iden));

	CONFIG *cfg ;
	const char* cnat_server_ip = NULL;
	
	global_data->d_sock[global_data->d_sock_i].umc_sock = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == global_data->d_sock[global_data->d_sock_i].umc_sock)
	{
		return ERROR_FAIL;
	}

	//从配置文件中读服务器ip
	cfg = config_load(UMC_SERVER_IP);
    if (NULL == cfg)
    {
    	 return ERROR_FAIL;	
    }
	else
    {
    	cnat_server_ip = config_get(cfg, "server_ip","");
		if(NULL == cnat_server_ip)
		{
			config_free(cfg); 
			return ERROR_FAIL;
		}
	}
 
	memset(&rl_addr, 0, sizeof(rl_addr));
	rl_addr.sin_family = AF_INET;
	rl_addr.sin_port = htons(global_data->d_sock[global_data->d_sock_i].port);
	rl_addr.sin_addr.s_addr = inet_addr(cnat_server_ip);
    config_free(cfg);
	ret = connect_nb(global_data->d_sock[global_data->d_sock_i].umc_sock, (struct sockaddr *)&rl_addr, sizeof(rl_addr), 5);
	if(0 == ret)	
	{
		cnat_close_socket(global_data, global_data->d_sock[global_data->d_sock_i].umc_sock);
		return ERROR_FAIL;		
	}
	
	get_connect_iden(&conn_iden, 1);
	ret = send(global_data->d_sock[global_data->d_sock_i].umc_sock, &conn_iden, sizeof(struct connect_iden), 0);
	if(ret <= 0)
	{
        free(netroomname);
		cnat_close_socket(global_data, global_data->d_sock[global_data->d_sock_i].umc_sock);
		return ERROR_FAIL;	
	}
    ret = send(global_data->d_sock[global_data->d_sock_i].umc_sock, netroomname, conn_iden.len, 0);
	if(ret <= 0)
	{
		free(netroomname);
		cnat_close_socket(global_data, global_data->d_sock[global_data->d_sock_i].umc_sock);
		return ERROR_FAIL;	
	}
	free(netroomname);
	
    ret = cnat_local_data_connect(global_data);
	if(ret == ERROR_FAIL)
	{
		cnat_close_socket(global_data, global_data->d_sock[global_data->d_sock_i].umc_sock);
		return ERROR_FAIL;
	}
	dloop_register_read_sock(global_data->d_sock[global_data->d_sock_i].umc_sock, cnat_send_to_local_handle, global_data, NULL );
	dloop_register_read_sock(global_data->d_sock[global_data->d_sock_i].local_sock, cnat_send_to_umc_handle, global_data, NULL);

	return ERROR_SUCCESS;
}