⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jnw_datagram.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 2 页
字号:
    return handle;
}


/*****************************************************************************
 * FUNCTION
 *  jnw_datagram_getmaxpacketsize
 * DESCRIPTION
 *  
 * PARAMETERS
 *  handle      [IN]        
 * RETURNS
 *  int
 *****************************************************************************/
int jnw_datagram_getmaxpacketsize(int handle)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint16 len;
    kal_int8 ret;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    ret = soc_getsockopt((kal_int8) handle, SOC_PKT_SIZE, (kal_uint8*) & len, sizeof(len));

    if (ret != SOC_SUCCESS)
    {
        net_errno = ret;
    #ifdef MIDP_CONNECTION_DEBUG
        sprintf(_kvmLogStr, "J2ME Error: datagram getMaximumLength handle=%d res=%d", handle, ret);
        Kputs(_kvmLogStr);
    #endif /* MIDP_CONNECTION_DEBUG */ 
        return 0;
    }

    return len;
}


/*****************************************************************************
 * FUNCTION
 *  jnw_datagram_get_packetsize
 * DESCRIPTION
 *  
 * PARAMETERS
 *  handle      [IN]        
 * RETURNS
 *  
 *****************************************************************************/
int jnw_datagram_get_packetsize(int handle)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint16 len;
    kal_int8 ret;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    ret = soc_getsockopt((kal_int8) handle, SOC_PKT_SIZE, (kal_uint8*) & len, sizeof(len));

    if (ret != SOC_SUCCESS)
    {
        net_errno = ret;
    #ifdef MIDP_CONNECTION_DEBUG
        sprintf(_kvmLogStr, "J2ME Error: datagram getMaximumLength handle=%d res=%d", handle, ret);
        Kputs(_kvmLogStr);
    #endif /* MIDP_CONNECTION_DEBUG */ 
        return 0;
    }

    return len;
}


/*****************************************************************************
 * FUNCTION
 *  jnw_datagram_gethost_byaddress
 * DESCRIPTION
 *  
 * PARAMETERS
 *  ipn         [IN]        
 *  host        [OUT]       
 *  dns_idx     [OUT]       
 * RETURNS
 *  int
 *****************************************************************************/
int jnw_datagram_gethost_byaddress(int ipn, char *host, int *dns_idx)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    int result;
    kal_uint32 temp = strlen(host);

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    /* important! use this comparison to block the case to connect CSD when 
       Java in paused mode or background running */
    if (jvm_no_network_connection() && jvm_is_in_background_long_time())
    {
        return -1;
    }

    /* obtain a unique dns request index */
    *dns_idx = jnw_socket_get_dns_idx();
     if (*dns_idx == -1)
     {
        /* Over the socket limit */
        return -1;
    }
   
    result = soc_gethostbyaddr(
                KAL_FALSE,
                MOD_JASYN,
                *dns_idx,
                /* only indicate the request is by Java */ host,
                &temp,
                (const kal_uint8*)&ipn,
                4,
                0,
                J2ME_active_nw_acc_id);
    if ((result == -2) &&
        (g_pcHostName[*dns_idx] == NULL))
    {
         g_pcHostName[*dns_idx] = (char*)get_ctrl_buffer(sizeof(ipn));
         memcpy(g_pcHostName[*dns_idx], &ipn, sizeof(ipn));
    }

#ifdef MIDP_CONNECTION_DEBUG
    sprintf(_kvmLogStr, "J2ME UDP Debug: getHostByAddr: %d, %s", ipn, host);
    Kputs(_kvmLogStr);
#endif /* MIDP_CONNECTION_DEBUG */ 

    return result;
}


/*****************************************************************************
 * FUNCTION
 *  jnw_datagram_send
 * DESCRIPTION
 *  
 * PARAMETERS
 *  handle          [IN]        
 *  ipnumber        [IN]        
 *  port            [IN]        
 *  buffer          [IN]        
 *  length          [IN]        
 * RETURNS
 *  
 *****************************************************************************/
int jnw_datagram_send(int handle, int ipnumber, int port, char *buffer, int length)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 write_len;
    sockaddr_struct addr;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    addr.addr[0] = HADDR_0(ipnumber);
    addr.addr[1] = HADDR_1(ipnumber);
    addr.addr[2] = HADDR_2(ipnumber);
    addr.addr[3] = HADDR_3(ipnumber);

    addr.addr_len = sizeof(ipnumber);
    addr.port = (kal_uint16) port;
    if (J2ME_asnyc_ind[handle].error_cause < 0)
    {
        return -1;
    }
    write_len = soc_sendto((kal_int8) handle, (kal_uint8*) buffer, length, 0, &addr);

#ifdef MIDP_CONNECTION_DEBUG
    sprintf(_kvmLogStr, "J2ME UDP Debug: datagram send0: handle %d want %d, real %d", handle, length, write_len);
    Kputs(_kvmLogStr);
#endif /* MIDP_CONNECTION_DEBUG */ 

    if (write_len <= 0)
    {
        if (write_len == SOC_WOULDBLOCK)
        {
            return IO_WOULDBLOCK;
        }
        else
        {
        #ifdef MIDP_CONNECTION_DEBUG
            sprintf(_kvmLogStr, "J2ME Error: datagram send0 failed error:%d", write_len);
            Kputs(_kvmLogStr);
        #endif /* MIDP_CONNECTION_DEBUG */ 

            return IO_INTERRUPTED;
        }
    }

    return write_len;
}


/*****************************************************************************
 * FUNCTION
 *  jnw_datagram_recv
 * DESCRIPTION
 *  
 * PARAMETERS
 *  handle          [IN]        
 *  ipnumber        [OUT]       
 *  port            [OUT]       
 *  buffer          [OUT]       
 *  length          [IN]        
 * RETURNS
 *  
 *****************************************************************************/
int jnw_datagram_recv(int handle, int *ipnumber, int *port, char *buffer, int length)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 recv_len;
    sockaddr_struct addr;
    int i;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (J2ME_asnyc_ind[handle].error_cause < 0)
    {
        return IO_INTERRUPTED;
    }
    recv_len = soc_recvfrom((kal_int8) handle, (kal_uint8*) buffer, length, 0, &addr);

    if (recv_len <= 0)
    {
        net_errno = recv_len;

    #ifdef MIDP_CONNECTION_DEBUG
        sprintf(_kvmLogStr, "J2ME Error: datagram receive0 failed error:%d", recv_len);
        Kputs(_kvmLogStr);
    #endif /* MIDP_CONNECTION_DEBUG */ 

        if (recv_len == SOC_WOULDBLOCK)
        {
            return IO_WOULDBLOCK;
        }
        else
        {
            return IO_INTERRUPTED;
        }
    }

    *ipnumber = 0;

    for (i = addr.addr_len - 1; i >= 0; i--)
    {
        *ipnumber = (*ipnumber << 8) + addr.addr[i];
    }

    *port = (int)addr.port;

    return recv_len;
}


/*****************************************************************************
 * FUNCTION
 *  jnw_datagram_close
 * DESCRIPTION
 *  
 * PARAMETERS
 *  handle      [IN]        
 * RETURNS
 *  
 *****************************************************************************/
int jnw_datagram_close(int handle)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int8 ret;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    resouceDereg(JAVA_IO_DATAGRAM_DEVICE, handle);
    ret = soc_close((kal_int8) handle);

    if (ret != SOC_SUCCESS)
    {
        net_errno = ret;

        if (ret == SOC_WOULDBLOCK)
        {
            ret = 0;
        }
        else
        {
            ret = -1;
        }
    }
    else
    {
        _active_datagram_count--;
        jui_widget_hide_connect_icon();
    }

    return (int)ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -