📄 plaindatagramsocketimpl.c
字号:
SignalError("java.net.SocketException", "Unsupported address family"); } /* zero out hostname to overwrite old name which does not match * the new address from which the packet came. */ unhand(unhand(pkt)->address)->hostName = NULL;DBG(NATIVENET, dprintf(" datagram_receive(%p, %p) -> from %s:%d; brecv=%ld\n", obj, pkt, ip2str(ntohl(addr.addr4.sin_addr.s_addr)), ntohs(addr.addr4.sin_port), (long) r););}/* * Close the socket. */voidgnu_java_net_PlainDatagramSocketImpl_datagramSocketClose(struct Hgnu_java_net_PlainDatagramSocketImpl* obj){ int r;DBG(NATIVENET, dprintf("datagram_close(%p)\n", obj);); if (unhand(obj)->native_fd != -1) { r = KSOCKCLOSE(unhand(obj)->native_fd); unhand(obj)->native_fd = -1; if (r) { SignalError("java.net.SocketException", SYS_ERROR(r)); } }}voidgnu_java_net_PlainDatagramSocketImpl_socketSetOption(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, jint opt, struct Hjava_lang_Object* arg){ struct Hjava_net_InetAddress* addrp; int v, r; unsigned int k; /* Do easy cases */ for (k = 0; k < sizeof(socketOptions) / sizeof(*socketOptions); k++) { if (opt == socketOptions[k].jopt) { v = unhand((struct Hjava_lang_Integer*)arg)->value; r = KSETSOCKOPT(unhand(obj)->native_fd, socketOptions[k].level, socketOptions[k].copt, &v, sizeof(v)); if (r) { SignalError("java.net.SocketException", SYS_ERROR(r)); } return; } } switch(opt) { case java_net_SocketOptions_IP_MULTICAST_IF:#if defined(IP_MULTICAST_IF) addrp = (struct Hjava_net_InetAddress*)arg; { struct in_addr ia; memcpy(&ia, unhand_byte_array(unhand(addrp)->addr), sizeof(ia)); r = KSETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_MULTICAST_IF, &ia, sizeof(ia)); if (r) { SignalError("java.net.SocketException", SYS_ERROR(r)); } }#else /* !defined(IP_MULTICAST_IF) */ SignalError("java.net.SocketException", "IP_MULTICAST_IF is not supported");#endif /* defined(IP_MULTICAST_IF) */ break; case java_net_SocketOptions_SO_BINDADDR: SignalError("java.net.SocketException", "Read-only socket option"); break; case java_net_SocketOptions_SO_TIMEOUT: /* JAVA takes care */ default: SignalError("java.net.SocketException", "Unimplemented socket option"); } }jintgnu_java_net_PlainDatagramSocketImpl_socketGetOption(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, jint opt){ int r = 0, v; unsigned int k; socklen_t vsize = sizeof(v); struct sockaddr_in addr; socklen_t alen = sizeof(addr); struct in_addr ia; socklen_t ia_len = sizeof(ia); /* Do easy cases */ for (k = 0; k < sizeof(socketOptions) / sizeof(*socketOptions); k++) { if (opt == socketOptions[k].jopt) { r = KGETSOCKOPT(unhand(obj)->native_fd, socketOptions[k].level, socketOptions[k].copt, &v, &vsize); if (r) { SignalError("java.net.SocketException", SYS_ERROR(r)); } return v; } } switch(opt) { case java_net_SocketOptions_SO_BINDADDR: r = KGETSOCKNAME(unhand(obj)->native_fd, (struct sockaddr*)&addr, &alen); if (r) { SignalError("java.net.SocketException", SYS_ERROR(r)); } r = htonl(addr.sin_addr.s_addr); break;#if defined(IP_MULTICAST_IF) case java_net_SocketOptions_IP_MULTICAST_IF: r = KGETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_MULTICAST_IF, &ia, &ia_len); if (r) { SignalError("java.net.SocketException", SYS_ERROR(r)); return (0); /* NOT REACHED, avoid warning */ } r = ntohl(ia.s_addr); break;#endif /* defined(IP_MULTICAST_IF) */ case java_net_SocketOptions_SO_TIMEOUT: /* JAVA takes care */ default: SignalError("java.net.SocketException", "Unimplemented socket option"); } return r;}/* * Join multicast group */voidgnu_java_net_PlainDatagramSocketImpl_join(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, struct Hjava_net_InetAddress* laddr){#if defined(IP_ADD_MEMBERSHIP) int r; struct ip_mreq ipm; int iface_addr; memset(&ipm, 0, sizeof(ipm)); memcpy(&ipm.imr_multiaddr, unhand_byte_array(unhand(laddr)->addr), sizeof(ipm.imr_multiaddr)); iface_addr = gnu_java_net_PlainDatagramSocketImpl_socketGetOption(obj, java_net_SocketOptions_IP_MULTICAST_IF); ipm.imr_interface.s_addr = htonl(iface_addr); DBG(NATIVENET, dprintf("datagram_join (%p, %p) => %s\n", obj, laddr, ip2str(ipm.imr_interface.s_addr)); ); r = KSETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipm, sizeof(ipm)); if (r) { SignalError("java.io.IOException", SYS_ERROR(r)); }#else /* !defined(IP_ADD_MEMBERSHIP) */ SignalError("java.net.SocketException", "IP_ADD_MEMBERSHIP not supported");#endif /* defined(IP_ADD_MEMBERSHIP) */}/* * leave multicast group */voidgnu_java_net_PlainDatagramSocketImpl_leave(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, struct Hjava_net_InetAddress* laddr){#if defined(IP_DROP_MEMBERSHIP) int r; struct ip_mreq ipm; int iface_addr; memset(&ipm, 0, sizeof(ipm)); memcpy(&ipm.imr_multiaddr, unhand_byte_array(unhand(laddr)->addr), sizeof(ipm.imr_multiaddr)); iface_addr = gnu_java_net_PlainDatagramSocketImpl_socketGetOption(obj, java_net_SocketOptions_IP_MULTICAST_IF); ipm.imr_interface.s_addr = htonl(iface_addr);DBG(NATIVENET, dprintf("datagram_leave (%p, %p) => %s\n", obj, laddr, ip2str(ipm.imr_interface.s_addr)); ); r = KSETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &ipm, sizeof(ipm)); if (r) { SignalError("java.io.IOException", SYS_ERROR(r)); }#else /* !defined(IP_DROP_MEMBERSHIP) */ SignalError("java.net.SocketException", "IP_DROP_MEMBERSHIP not supported");#endif /* defined(IP_DROP_MEMBERSHIP) */}/* * Join multicast group */voidgnu_java_net_PlainDatagramSocketImpl_joinGroup(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, struct Hjava_net_SocketAddress *jsa, struct Hjava_net_NetworkInterface *jni){#if defined(IP_ADD_MEMBERSHIP) struct Hjava_net_InetSocketAddress *jisa; struct ip_mreq ipm; int r = 0; jisa = (struct Hjava_net_InetSocketAddress *)jsa; memset(&ipm, 0, sizeof(ipm)); memcpy(&ipm.imr_multiaddr, unhand_byte_array(unhand(unhand(jisa)->addr)->addr), sizeof(ipm.imr_multiaddr));DBG(NATIVENET, dprintf(" datagram_joinGroup(%p, %p, %p) -> join %s\n", obj, jsa, jni, ip2str(ipm.imr_multiaddr.s_addr)); ); if( jni && obj_length(unhand(unhand(jni)->inetAddresses)->elementData) != 0) { struct Hjava_net_InetAddress* if_addr = (struct Hjava_net_InetAddress *) unhand_object_array(unhand(unhand(jni)->inetAddresses)->elementData); memcpy(&ipm.imr_interface, unhand_byte_array(unhand(if_addr)->addr), sizeof(ipm.imr_interface));; } else { ipm.imr_interface.s_addr = gnu_java_net_PlainDatagramSocketImpl_socketGetOption(obj, java_net_SocketOptions_IP_MULTICAST_IF); } r = KSETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipm, sizeof(ipm)); if (r) { SignalError("java.io.IOException", SYS_ERROR(r)); }#else /* !defined(IP_ADD_MEMBERSHIP) */ SignalError("java.net.SocketException", "IP_ADD_MEMBERSHIP not supported");#endif /* defined(IP_ADD_MEMBERSHIP) */}/* * Leave multicast group */voidgnu_java_net_PlainDatagramSocketImpl_leaveGroup(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, struct Hjava_net_SocketAddress *jsa, struct Hjava_net_NetworkInterface *jni){#if defined(IP_ADD_MEMBERSHIP) struct Hjava_net_InetSocketAddress *jisa; struct ip_mreq ipm; int r; jisa = (struct Hjava_net_InetSocketAddress *)jsa; memset(&ipm, 0, sizeof(ipm)); memcpy(&ipm.imr_multiaddr, unhand_byte_array(unhand(unhand(jisa)->addr)->addr), sizeof(ipm.imr_multiaddr)); if( jni && obj_length(unhand(unhand(jni)->inetAddresses)->elementData) != 0) { struct Hjava_net_InetAddress* if_addr = (struct Hjava_net_InetAddress *) unhand_object_array(unhand(unhand(jni)->inetAddresses)->elementData); memcpy(&ipm.imr_interface, unhand_byte_array(unhand(if_addr)->addr), sizeof(ipm.imr_interface));; } else { ipm.imr_interface.s_addr = gnu_java_net_PlainDatagramSocketImpl_socketGetOption(obj, java_net_SocketOptions_IP_MULTICAST_IF); } r = KSETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &ipm, sizeof(ipm)); if (r) { SignalError("java.io.IOException", SYS_ERROR(r)); }#else /* !defined(IP_ADD_MEMBERSHIP) */ SignalError("java.net.SocketException", "IP_ADD_MEMBERSHIP not supported");#endif /* defined(IP_ADD_MEMBERSHIP) */}/* * set multicast-TTL */voidgnu_java_net_PlainDatagramSocketImpl_setTTL(struct Hgnu_java_net_PlainDatagramSocketImpl* obj, jbyte ttl){#if defined(IP_MULTICAST_TTL) int r; unsigned char v = (unsigned char)ttl; r = KSETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_MULTICAST_TTL, &v, sizeof(v)); if (r) { SignalError("java.io.IOException", SYS_ERROR(r)); }#else /* !defined(IP_MULTICAST_TTL) */ SignalError("java.net.SocketException", "IP_MULTICAST_TTL not supported");#endif /* defined(IP_MULTICAST_TTL) */}/* * get multicast-TTL */jbytegnu_java_net_PlainDatagramSocketImpl_getTTL(struct Hgnu_java_net_PlainDatagramSocketImpl* obj){#if defined(IP_MULTICAST_TTL) unsigned char v; socklen_t s = 1; int r; r = KGETSOCKOPT(unhand(obj)->native_fd, IPPROTO_IP, IP_MULTICAST_TTL, &v, &s); if (r) { SignalError("java.io.IOException", SYS_ERROR(r)); } return (jbyte)v;#else /* !defined(IP_MULTICAST_TTL) */ SignalError("java.net.SocketException", "IP_MULTICAST_TTL not supported");#endif /* defined(IP_MULTICAST_TTL) */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -