/* * 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; }
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; }
/******************************************************************************* 函数名称 : 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; }