📄 jnw_datagram.c
字号:
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 + -