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

📄 plaindatagramsocketimpl.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -