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;
}
示例#2
0
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);
}