kii_socket_code_t socket_connect_cb( kii_socket_context_t* socket_context, const char* host, unsigned int port) { int ret; DNC_CFG_CMD dnsCfg; DNC_RESP_INFO dnsRespInfo; SOCKADDR_T hostAddr; A_UINT32 sock; SSL *ssl = NULL; SSL_CTX *ssl_ctx = NULL; context_t *ctx = (context_t*)socket_context->app_context; memset(&dnsRespInfo, 0, sizeof(dnsRespInfo)); /*Check if driver is loaded*/ if(IS_DRIVER_READY != A_OK){ return KII_SOCKETC_FAIL; } // resolve the IP address of the host if (0 == ath_inet_aton(host, &dnsRespInfo.ipaddrs_list[0])) { if (strlen(host) >= sizeof(dnsCfg.ahostname)) { printf("GetERROR: host name too long\n"); return KII_SOCKETC_FAIL; } strcpy((char*)dnsCfg.ahostname, host); dnsCfg.domain = ATH_AF_INET; dnsCfg.mode = RESOLVEHOSTNAME; if (A_OK != custom_ip_resolve_hostname(handle, &dnsCfg, &dnsRespInfo)) { printf("GetERROR: Unable to resolve host name\r\n"); return KII_SOCKETC_FAIL; } dnsRespInfo.ipaddrs_list[0] = A_BE2CPU32(dnsRespInfo.ipaddrs_list[0]); } #if CONNECT_SSL ssl_ctx = SSL_ctx_new(SSL_CLIENT, 4500, 2000, 0); if (ssl_ctx == NULL){ printf("failed to init ssl context.\n"); return KII_SOCKETC_FAIL; } #endif sock = t_socket((void *)handle, ATH_AF_INET, SOCK_STREAM_TYPE, 0); if (sock < 0) { printf("failed to init socket.\n"); return KII_SOCKETC_FAIL; } memset(&hostAddr, 0x00, sizeof(hostAddr)); hostAddr.sin_family = ATH_AF_INET; hostAddr.sin_addr = dnsRespInfo.ipaddrs_list[0]; hostAddr.sin_port = port; if (t_connect((void *)handle, sock, &hostAddr, sizeof(hostAddr)) == A_ERROR){ printf("failed to connect socket.\n"); return KII_SOCKETC_FAIL; } #if CONNECT_SSL ssl = SSL_new(ssl_ctx); if (ssl == NULL){ printf("failed to init ssl.\n"); return KII_SOCKETC_FAIL; } ret = SSL_set_fd(ssl, sock); if (ret < 0){ printf("failed to set fd: %d\n", ret); return KII_SOCKETC_FAIL; } ret = SSL_connect(ssl); if (ret < 0) { printf("failed to connect: %d\n", ret); return KII_SOCKETC_FAIL; } #endif ctx->sock = sock; ctx->ssl = ssl; ctx->ssl_ctx = ssl_ctx; return KII_SOCKETC_OK; }
HTCPCONN tcp_ipv6_server_init(unsigned short p_usPort, void * arg ) { gFunctions = (T_PFN_functions *)arg; SOCKTYPE sock = t_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { C_NLOG_ERR("Iniche:tcp_ipv6_server_init: couldn't create ip6 socket"); return NULL; } //add sock in array int i = 0; int isSett = 0; for(;i < MAX_SOCK_NO; i++) { if(g_sockets[i].sock == INVALID_SOCKET) { g_sockets[i].sock = sock; g_sockets[i].indxToListen = -1; isSett = 1; break; } } if(isSett == 0) { t_socketclose(sock); C_NLOG_ERR("Iniche:tcp_ipv6_server_init: couldn't create ip6 socket."); return NULL; } struct sockaddr_in6 tcpsin6; int addrlen = sizeof(tcpsin6); IP6CPY(&tcpsin6.sin6_addr, &in6addr_any); tcpsin6.sin6_port = htons(p_usPort); tcpsin6.sin6_family = AF_INET6; int e = t_bind(g_sockets[i].sock, (struct sockaddr *)&tcpsin6, addrlen); if (e != 0) { e = t_errno(g_sockets[i].sock); t_socketclose(g_sockets[i].sock); g_sockets[i].sock = INVALID_SOCKET; C_NLOG_ERR("Iniche:tcp_ipv6_server_init: error %d binding tcp listen on port %d",e, p_usPort); return NULL; } int iTmp = 1; e = t_setsockopt(g_sockets[i].sock, SOL_SOCKET, SO_NONBLOCK, (void *)&iTmp, sizeof(iTmp)); if (e == SOCKET_ERROR) { e = t_errno(g_sockets[i].sock); t_socketclose(g_sockets[i].sock); g_sockets[i].sock = INVALID_SOCKET; C_NLOG_ERR("Iniche:tcp_ipv6_server_init: t_setsockopt() SO_NONBLOCK failed, Err: %d", e); return NULL; } e = t_listen(g_sockets[i].sock,MAX_SOCK_NO); if (e != 0) { e = t_errno(g_sockets[i].sock); t_socketclose(g_sockets[i].sock); g_sockets[i].sock = INVALID_SOCKET; C_NLOG_ERR("Iniche:tcp_ipv6_server_init: error %d tcp can't listen on port %d",e, p_usPort); return NULL; } C_NLOG_INFO( "Iniche:tcp_ipv6_server_init: TCP server initialized successfully." ); return (HTCPCONN)(g_sockets+i); }