📄 network.c
字号:
#endif
if (ss == APR_SUCCESS)
return (jint)nbytes;
else {
TCN_ERROR_WRAP(ss);
return -(jint)ss;
}
}
TCN_IMPLEMENT_CALL(jint, Socket, recvbt)(TCN_STDARGS, jlong sock,
jobject buf, jint offset,
jint len, jlong timeout)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_status_t ss;
apr_size_t nbytes = (apr_size_t)len;
char *bytes;
apr_interval_time_t t;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(buf != NULL);
TCN_ASSERT(s->opaque != NULL);
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
TCN_ASSERT(bytes != NULL);
if ((ss = (*s->net->timeout_get)(s->opaque, &t)) != APR_SUCCESS)
return -(jint)ss;
if ((ss = (*s->net->timeout_set)(s->opaque, J2T(timeout))) != APR_SUCCESS)
return -(jint)ss;
ss = (*s->net->recv)(s->opaque, bytes + offset, &nbytes);
/* Resore the original timeout */
(*s->net->timeout_set)(s->opaque, t);
#ifdef TCN_DO_STATISTICS
if (ss == APR_SUCCESS) {
sp_max_recv = TCN_MAX(sp_max_recv, nbytes);
sp_min_recv = TCN_MIN(sp_min_recv, nbytes);
sp_tot_recv += nbytes;
sp_num_recv++;
}
else {
if (APR_STATUS_IS_ETIMEDOUT(ss) ||
APR_STATUS_IS_TIMEUP(ss))
sp_tmo_recv++;
else if (APR_STATUS_IS_ECONNABORTED(ss) ||
APR_STATUS_IS_ECONNRESET(ss) ||
APR_STATUS_IS_EOF(ss))
sp_rst_recv++;
else {
sp_err_recv++;
sp_erl_recv = ss;
}
}
#endif
if (ss == APR_SUCCESS)
return (jint)nbytes;
else {
TCN_ERROR_WRAP(ss);
return -(jint)ss;
}
}
TCN_IMPLEMENT_CALL(jint, Socket, recvbbt)(TCN_STDARGS, jlong sock,
jint offset,
jint len, jlong timeout)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_status_t ss;
apr_size_t nbytes = (apr_size_t)len;
apr_interval_time_t t;
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
TCN_ASSERT(s->jrbbuff != NULL);
TCN_ASSERT(s->opaque != NULL);
if ((ss = (*s->net->timeout_get)(s->opaque, &t)) != APR_SUCCESS)
return -(jint)ss;
if ((ss = (*s->net->timeout_set)(s->opaque, J2T(timeout))) != APR_SUCCESS)
return -(jint)ss;
ss = (*s->net->recv)(s->opaque, s->jrbbuff + offset, &nbytes);
/* Resore the original timeout */
(*s->net->timeout_set)(s->opaque, t);
#ifdef TCN_DO_STATISTICS
if (ss == APR_SUCCESS) {
sp_max_recv = TCN_MAX(sp_max_recv, nbytes);
sp_min_recv = TCN_MIN(sp_min_recv, nbytes);
sp_tot_recv += nbytes;
sp_num_recv++;
}
else {
if (APR_STATUS_IS_ETIMEDOUT(ss) ||
APR_STATUS_IS_TIMEUP(ss))
sp_tmo_recv++;
else if (APR_STATUS_IS_ECONNABORTED(ss) ||
APR_STATUS_IS_ECONNRESET(ss) ||
APR_STATUS_IS_EOF(ss))
sp_rst_recv++;
else {
sp_err_recv++;
sp_erl_recv = ss;
}
}
#endif
if (ss == APR_SUCCESS)
return (jint)nbytes;
else {
TCN_ERROR_WRAP(ss);
return -(jint)ss;
}
}
TCN_IMPLEMENT_CALL(jint, Socket, recvfrom)(TCN_STDARGS, jlong from,
jlong sock, jint flags,
jbyteArray buf, jint offset, jint toread)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_sockaddr_t *f = J2P(from, apr_sockaddr_t *);
apr_size_t nbytes = (apr_size_t)toread;
jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
apr_status_t ss;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(s->sock != NULL);
TCN_ASSERT(buf != NULL);
ss = apr_socket_recvfrom(f, s->sock, (apr_int32_t)flags, (char*)(bytes + offset), &nbytes);
(*e)->ReleaseByteArrayElements(e, buf, bytes,
nbytes ? 0 : JNI_ABORT);
if (ss == APR_SUCCESS)
return (jint)nbytes;
else {
TCN_ERROR_WRAP(ss);
return -(jint)ss;
}
}
TCN_IMPLEMENT_CALL(jint, Socket, optSet)(TCN_STDARGS, jlong sock,
jint opt, jint on)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
if (!s->sock)
return APR_EINVAL;
else
return (jint)(*s->net->opt_set)(s->opaque, (apr_int32_t)opt, (apr_int32_t)on);
}
TCN_IMPLEMENT_CALL(jint, Socket, optGet)(TCN_STDARGS, jlong sock,
jint opt)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_int32_t on = 0;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
if (s->sock)
tcn_ThrowAPRException(e, APR_EINVAL);
else {
TCN_THROW_IF_ERR((*s->net->opt_get)(s->opaque, (apr_int32_t)opt,
&on), on);
}
cleanup:
return (jint)on;
}
TCN_IMPLEMENT_CALL(jint, Socket, timeoutSet)(TCN_STDARGS, jlong sock,
jlong timeout)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
TCN_ASSERT(s->opaque != NULL);
return (jint)(*s->net->timeout_set)(s->opaque, J2T(timeout));
}
TCN_IMPLEMENT_CALL(jlong, Socket, timeoutGet)(TCN_STDARGS, jlong sock)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_interval_time_t timeout;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(s->opaque != NULL);
TCN_THROW_IF_ERR((*s->net->timeout_get)(s->opaque, &timeout), timeout);
cleanup:
return (jlong)timeout;
}
TCN_IMPLEMENT_CALL(jboolean, Socket, atmark)(TCN_STDARGS, jlong sock)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_int32_t mark;
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
TCN_ASSERT(s->sock != NULL);
if (apr_socket_atmark(s->sock, &mark) != APR_SUCCESS)
return JNI_FALSE;
return mark ? JNI_TRUE : JNI_FALSE;
}
#if APR_HAS_SENDFILE
TCN_IMPLEMENT_CALL(jlong, Socket, sendfile)(TCN_STDARGS, jlong sock,
jlong file,
jobjectArray headers,
jobjectArray trailers,
jlong offset, jlong len,
jint flags)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_file_t *f = J2P(file, apr_file_t *);
jsize nh = 0;
jsize nt = 0;
jsize i;
struct iovec hvec[APR_MAX_IOVEC_SIZE];
struct iovec tvec[APR_MAX_IOVEC_SIZE];
jobject hba[APR_MAX_IOVEC_SIZE];
jobject tba[APR_MAX_IOVEC_SIZE];
apr_off_t off = (apr_off_t)offset;
apr_size_t written = (apr_size_t)len;
apr_hdtr_t hdrs;
apr_status_t ss;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(file != 0);
if (s->net->type != TCN_SOCKET_APR)
return (jint)(-APR_ENOTIMPL);
if (headers)
nh = (*e)->GetArrayLength(e, headers);
if (trailers)
nt = (*e)->GetArrayLength(e, trailers);
/* Check for overflow */
if (nh >= APR_MAX_IOVEC_SIZE || nt >= APR_MAX_IOVEC_SIZE)
return (jint)(-APR_ENOMEM);
for (i = 0; i < nh; i++) {
hba[i] = (*e)->GetObjectArrayElement(e, headers, i);
hvec[i].iov_len = (*e)->GetArrayLength(e, hba[i]);
hvec[i].iov_base = (*e)->GetByteArrayElements(e, hba[i], NULL);
}
for (i = 0; i < nt; i++) {
tba[i] = (*e)->GetObjectArrayElement(e, trailers, i);
tvec[i].iov_len = (*e)->GetArrayLength(e, tba[i]);
tvec[i].iov_base = (*e)->GetByteArrayElements(e, tba[i], NULL);
}
hdrs.headers = &hvec[0];
hdrs.numheaders = nh;
hdrs.trailers = &tvec[0];
hdrs.numtrailers = nt;
ss = apr_socket_sendfile(s->sock, f, &hdrs, &off, &written, (apr_int32_t)flags);
#ifdef TCN_DO_STATISTICS
sf_max_send = TCN_MAX(sf_max_send, written);
sf_min_send = TCN_MIN(sf_min_send, written);
sf_tot_send += written;
sf_num_send++;
#endif
for (i = 0; i < nh; i++) {
(*e)->ReleaseByteArrayElements(e, hba[i], hvec[i].iov_base, JNI_ABORT);
}
for (i = 0; i < nt; i++) {
(*e)->ReleaseByteArrayElements(e, tba[i], tvec[i].iov_base, JNI_ABORT);
}
/* Return Number of bytes actually sent,
* including headers, file, and trailers
*/
if (ss == APR_SUCCESS)
return (jlong)written;
else {
TCN_ERROR_WRAP(ss);
return -(jlong)ss;
}
}
TCN_IMPLEMENT_CALL(jlong, Socket, sendfilen)(TCN_STDARGS, jlong sock,
jlong file,
jlong offset, jlong len,
jint flags)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_file_t *f = J2P(file, apr_file_t *);
apr_off_t off = (apr_off_t)offset;
apr_size_t written = (apr_size_t)len;
apr_hdtr_t hdrs;
apr_status_t ss;
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
TCN_ASSERT(file != 0);
if (s->net->type != TCN_SOCKET_APR)
return (jint)(-APR_ENOTIMPL);
hdrs.headers = NULL;
hdrs.numheaders = 0;
hdrs.trailers = NULL;
hdrs.numtrailers = 0;
ss = apr_socket_sendfile(s->sock, f, &hdrs, &off, &written, (apr_int32_t)flags);
#ifdef TCN_DO_STATISTICS
sf_max_send = TCN_MAX(sf_max_send, written);
sf_min_send = TCN_MIN(sf_min_send, written);
sf_tot_send += written;
sf_num_send++;
#endif
/* Return Number of bytes actually sent,
* including headers, file, and trailers
*/
if (ss == APR_SUCCESS)
return (jlong)written;
else {
TCN_ERROR_WRAP(ss);
return -(jlong)ss;
}
}
#else /* APR_HAS_SENDIFLE */
TCN_IMPLEMENT_CALL(jlong, Socket, sendfile)(TCN_STDARGS, jlong sock,
jlong file,
jobjectArray headers,
jobjectArray trailers,
jlong offset, jlong len,
jint flags)
{
UNREFERENCED_STDARGS;
UNREFERENCED(sock);
UNREFERENCED(file);
UNREFERENCED(headers);
UNREFERENCED(trailers);
UNREFERENCED(offset);
UNREFERENCED(len);
UNREFERENCED(flags);
return -(jlong)APR_ENOTIMPL;
}
TCN_IMPLEMENT_CALL(jlong, Socket, sendfilen)(TCN_STDARGS, jlong sock,
jlong file,
jlong offset, jlong len,
jint flags)
{
UNREFERENCED_STDARGS;
UNREFERENCED(sock);
UNREFERENCED(file);
UNREFERENCED(offset);
UNREFERENCED(len);
UNREFERENCED(flags);
return -(jlong)APR_ENOTIMPL;
}
#endif /* APR_HAS_SENDIFLE */
TCN_IMPLEMENT_CALL(jint, Socket, acceptfilter)(TCN_STDARGS,
jlong sock,
jstring name,
jstring args)
{
#if APR_HAS_SO_ACCEPTFILTER
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
TCN_ALLOC_CSTRING(name);
TCN_ALLOC_CSTRING(args);
apr_status_t rv;
UNREFERENCED(o);
rv = apr_socket_accept_filter(s->sock, J2S(name),
J2S(args) ? J2S(args) : "");
TCN_FREE_CSTRING(name);
TCN_FREE_CSTRING(args);
return (jint)rv;
#else
UNREFERENCED_STDARGS;
UNREFERENCED(sock);
UNREFERENCED(name);
UNREFERENCED(args);
return (jint)APR_ENOTIMPL;
#endif
}
TCN_IMPLEMENT_CALL(jint, Mulicast, join)(TCN_STDARGS,
jlong sock, jlong join,
jlong iface, jlong source)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_sockaddr_t *ja = J2P(join, apr_sockaddr_t *);
apr_sockaddr_t *ia = J2P(iface, apr_sockaddr_t *);
apr_sockaddr_t *sa = J2P(source, apr_sockaddr_t *);
UNREFERENCED_STDARGS;
return (jint)apr_mcast_join(s->sock, ja, ia, sa);
};
TCN_IMPLEMENT_CALL(jint, Mulicast, leave)(TCN_STDARGS,
jlong sock, jlong addr,
jlong iface, jlong source)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_sockaddr_t *aa = J2P(addr, apr_sockaddr_t *);
apr_sockaddr_t *ia = J2P(iface, apr_sockaddr_t *);
apr_sockaddr_t *sa = J2P(source, apr_sockaddr_t *);
UNREFERENCED_STDARGS;
return (jint)apr_mcast_leave(s->sock, aa, ia, sa);
};
TCN_IMPLEMENT_CALL(jint, Mulicast, hops)(TCN_STDARGS,
jlong sock, jint ttl)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
return (jint)apr_mcast_hops(s->sock, (apr_byte_t)ttl);
};
TCN_IMPLEMENT_CALL(jint, Mulicast, loopback)(TCN_STDARGS,
jlong sock, jboolean opt)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
return (jint)apr_mcast_loopback(s->sock, opt == JNI_TRUE ? 1 : 0);
};
TCN_IMPLEMENT_CALL(jint, Mulicast, ointerface)(TCN_STDARGS,
jlong sock, jlong iface)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_sockaddr_t *ia = J2P(iface, apr_sockaddr_t *);
UNREFERENCED_STDARGS;
return (jint)apr_mcast_interface(s->sock, ia);
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -