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

📄 natplainsocketimplposix.cc

📁 gcc的组建
💻 CC
📖 第 1 页 / 共 2 页
字号:
read_helper (gnu::java::net::PlainSocketImpl *soc_impl,             jbyte *bytes, jint count){  // If zero bytes were requested, short circuit so that recv  // doesn't signal EOF.  if (count == 0)    return 0;      // Do timeouts via select.  if (soc_impl->timeout > 0      && soc_impl->native_fd >= 0      && soc_impl->native_fd < FD_SETSIZE)    {      // Create the file descriptor set.      fd_set read_fds;      FD_ZERO (&read_fds);      FD_SET (soc_impl->native_fd, &read_fds);      // Create the timeout struct based on our internal timeout value.      struct timeval timeout_value;      timeout_value.tv_sec = soc_impl->timeout / 1000;      timeout_value.tv_usec =(soc_impl->timeout % 1000) * 1000;      // Select on the fds.      int sel_retval =        _Jv_select (soc_impl->native_fd + 1,                    &read_fds, NULL, NULL, &timeout_value);      // We're only interested in the 0 return.      // error returns still require us to try to read       // the socket to see what happened.      if (sel_retval == 0)        {          ::java::net::SocketTimeoutException *timeoutException =            new ::java::net::SocketTimeoutException            (JvNewStringUTF ("Read timed out"));	  throw timeoutException;        }    }  // Read the socket.  int r = ::recv (soc_impl->native_fd, (char *) bytes, count, 0);  if (r == 0)    {      throw_on_sock_closed (soc_impl);      return -1;    }  if (::java::lang::Thread::interrupted())    {      ::java::io::InterruptedIOException *iioe =        new ::java::io::InterruptedIOException        (JvNewStringUTF ("Read interrupted"));      iioe->bytesTransferred = r == -1 ? 0 : r;      throw iioe;    }  else if (r == -1)    {      throw_on_sock_closed (soc_impl);      // Some errors cause us to return end of stream...      if (errno == ENOTCONN)        return -1;      // Other errors need to be signalled.      throw new ::java::io::IOException (JvNewStringUTF (strerror (errno)));    }  return r;}// How many bytes are available?jintgnu::java::net::PlainSocketImpl::available(void){#if defined(FIONREAD) || defined(HAVE_SELECT)  int num = 0;  int r = 0;  bool num_set = false;#if defined(FIONREAD)  r = ::ioctl (native_fd, FIONREAD, &num);  if (r == -1 && errno == ENOTTY)    {      // If the ioctl doesn't work, we don't care.      r = 0;      num = 0;    }  else    num_set = true;#elif defined(HAVE_SELECT)  if (native_fd < 0)    {      errno = EBADF;      r = -1;    }#endif  if (r == -1)    {    posix_error:      throw new ::java::io::IOException(JvNewStringUTF(strerror(errno)));    }  // If we didn't get anything we can use select.#if defined(HAVE_SELECT)  if (! num_set)    if (! num_set && native_fd >= 0 && native_fd < FD_SETSIZE)      {        fd_set rd;        FD_ZERO (&rd);        FD_SET (native_fd, &rd);        struct timeval tv;        tv.tv_sec = 0;        tv.tv_usec = 0;        r = _Jv_select (native_fd + 1, &rd, NULL, NULL, &tv);        if(r == -1)          goto posix_error;        num = r == 0 ? 0 : 1;      }#endif /* HAVE_SELECT */  return (jint) num;#else  throw new ::java::io::IOException (JvNewStringUTF ("unimplemented"));#endif}voidgnu::java::net::PlainSocketImpl::setOption (jint optID, ::java::lang::Object *value){  int val;  socklen_t val_len = sizeof (val);  if (native_fd < 0)    throw new ::java::net::SocketException (JvNewStringUTF ("Socket closed"));  if (_Jv_IsInstanceOf (value, &::java::lang::Boolean::class$))    {      ::java::lang::Boolean *boolobj =         static_cast< ::java::lang::Boolean *> (value);      if (boolobj->booleanValue())        val = 1;       else         {          if (optID == _Jv_SO_LINGER_)            val = -1;          else            val = 0;        }    }  else if (_Jv_IsInstanceOf (value, &::java::lang::Integer::class$))    {      ::java::lang::Integer *intobj =         static_cast< ::java::lang::Integer *> (value);                val = (int) intobj->intValue();    }  else    {      throw new ::java::lang::IllegalArgumentException (        JvNewStringLatin1 ("`value' must be Boolean or Integer"));    }  switch (optID)     {      case _Jv_TCP_NODELAY_ :#ifdef TCP_NODELAY        if (::setsockopt (native_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &val,                          val_len) != 0)          goto error;#else        throw new ::java::lang::InternalError          (JvNewStringUTF ("TCP_NODELAY not supported"));#endif /* TCP_NODELAY */        return;      case _Jv_SO_KEEPALIVE_ :        if (::setsockopt (native_fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &val,                          val_len) != 0)          goto error;        return;            case _Jv_SO_BROADCAST_ :        throw new ::java::net::SocketException          (JvNewStringUTF ("SO_BROADCAST not valid for TCP"));        return;	      case _Jv_SO_OOBINLINE_ :        if (::setsockopt (native_fd, SOL_SOCKET, SO_OOBINLINE, (char *) &val,                          val_len) != 0)          goto error;        return;      case _Jv_SO_LINGER_ :#ifdef SO_LINGER        struct linger l_val;        l_val.l_onoff = (val != -1);        l_val.l_linger = val;        if (::setsockopt (native_fd, SOL_SOCKET, SO_LINGER, (char *) &l_val,                          sizeof(l_val)) != 0)          goto error;    #else        throw new ::java::lang::InternalError (          JvNewStringUTF ("SO_LINGER not supported"));#endif /* SO_LINGER */        return;      case _Jv_SO_SNDBUF_ :      case _Jv_SO_RCVBUF_ :#if defined(SO_SNDBUF) && defined(SO_RCVBUF)        int opt;        optID == _Jv_SO_SNDBUF_ ? opt = SO_SNDBUF : opt = SO_RCVBUF;        if (::setsockopt (native_fd, SOL_SOCKET, opt, (char *) &val, val_len) != 0)          goto error;    #else        throw new ::java::lang::InternalError (          JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported"));#endif         return;      case _Jv_SO_BINDADDR_ :        throw new ::java::net::SocketException (          JvNewStringUTF ("SO_BINDADDR: read only option"));        return;      case _Jv_IP_MULTICAST_IF_ :        throw new ::java::net::SocketException (          JvNewStringUTF ("IP_MULTICAST_IF: not valid for TCP"));        return;	      case _Jv_IP_MULTICAST_IF2_ :        throw new ::java::net::SocketException (          JvNewStringUTF ("IP_MULTICAST_IF2: not valid for TCP"));        return;	      case _Jv_IP_MULTICAST_LOOP_ :        throw new ::java::net::SocketException (          JvNewStringUTF ("IP_MULTICAST_LOOP: not valid for TCP"));        return;	      case _Jv_IP_TOS_ :        if (::setsockopt (native_fd, SOL_SOCKET, IP_TOS, (char *) &val,                          val_len) != 0)          goto error;            return;	      case _Jv_SO_REUSEADDR_ :#if defined(SO_REUSEADDR)	if (::setsockopt (native_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &val,	    val_len) != 0)	  goto error;	return;#else        throw new ::java::lang::InternalError (          JvNewStringUTF ("SO_REUSEADDR not supported"));#endif       case _Jv_SO_TIMEOUT_ :        timeout = val;        return;      default :        errno = ENOPROTOOPT;    } error:  char* strerr = strerror (errno);  throw new ::java::net::SocketException (JvNewStringUTF (strerr));}::java::lang::Object *gnu::java::net::PlainSocketImpl::getOption (jint optID){  int val;  socklen_t val_len = sizeof(val);  union SockAddr u;  socklen_t addrlen = sizeof(u);  struct linger l_val;  socklen_t l_val_len = sizeof(l_val);  switch (optID)    {#ifdef TCP_NODELAY    case _Jv_TCP_NODELAY_ :      if (::getsockopt (native_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &val,                        &val_len) != 0)        goto error;      else        return new ::java::lang::Boolean (val != 0);#else      throw new ::java::lang::InternalError        (JvNewStringUTF ("TCP_NODELAY not supported"));#endif             break;          case _Jv_SO_LINGER_ :#ifdef SO_LINGER      if (::getsockopt (native_fd, SOL_SOCKET, SO_LINGER, (char *) &l_val,                        &l_val_len) != 0)        goto error;           if (l_val.l_onoff)        return new ::java::lang::Integer (l_val.l_linger);      else        return new ::java::lang::Boolean ((jboolean)false);#else      throw new ::java::lang::InternalError        (JvNewStringUTF ("SO_LINGER not supported"));#endif      break;        case _Jv_SO_KEEPALIVE_ :      if (::getsockopt (native_fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &val,                        &val_len) != 0)        goto error;      else        return new ::java::lang::Boolean (val != 0);    case _Jv_SO_BROADCAST_ :      if (::getsockopt (native_fd, SOL_SOCKET, SO_BROADCAST, (char *) &val,                        &val_len) != 0)        goto error;          return new ::java::lang::Boolean ((jboolean)val);	    case _Jv_SO_OOBINLINE_ :      if (::getsockopt (native_fd, SOL_SOCKET, SO_OOBINLINE, (char *) &val,                        &val_len) != 0)        goto error;          return new ::java::lang::Boolean ((jboolean)val);	    case _Jv_SO_RCVBUF_ :    case _Jv_SO_SNDBUF_ :#if defined(SO_SNDBUF) && defined(SO_RCVBUF)      int opt;      optID == _Jv_SO_SNDBUF_ ? opt = SO_SNDBUF : opt = SO_RCVBUF;      if (::getsockopt (native_fd, SOL_SOCKET, opt, (char *) &val, &val_len) != 0)        goto error;          else        return new ::java::lang::Integer (val);#else      throw new ::java::lang::InternalError        (JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported"));#endif          break;    case _Jv_SO_BINDADDR_:      // cache the local address       if (localAddress == NULL)        {          jbyteArray laddr;          if (::getsockname (native_fd, (sockaddr*) &u, &addrlen) != 0)            goto error;          if (u.address.sin_family == AF_INET)            {              laddr = JvNewByteArray (4);              memcpy (elements (laddr), &u.address.sin_addr, 4);            }#ifdef HAVE_INET6          else if (u.address.sin_family == AF_INET6)            {              laddr = JvNewByteArray (16);              memcpy (elements (laddr), &u.address6.sin6_addr, 16);            }#endif          else            throw new ::java::net::SocketException              (JvNewStringUTF ("invalid family"));          localAddress = new ::java::net::InetAddress (laddr, NULL);        }      return localAddress;      break;    case _Jv_IP_MULTICAST_IF_ :      throw new ::java::net::SocketException        (JvNewStringUTF ("IP_MULTICAST_IF: not valid for TCP"));      break;	    case _Jv_IP_MULTICAST_IF2_ :      throw new ::java::net::SocketException        (JvNewStringUTF ("IP_MULTICAST_IF2: not valid for TCP"));      break;	    case _Jv_IP_MULTICAST_LOOP_ :      throw new ::java::net::SocketException        (JvNewStringUTF ("IP_MULTICAST_LOOP: not valid for TCP"));      break;	    case _Jv_IP_TOS_ :      if (::getsockopt (native_fd, SOL_SOCKET, IP_TOS, (char *) &val,                        &val_len) != 0)        goto error;      return new ::java::lang::Integer (val);      break;	    case _Jv_SO_REUSEADDR_ :#if defined(SO_REUSEADDR)      if (::getsockopt (native_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &val,                        &val_len) != 0)        goto error;    #else        throw new ::java::lang::InternalError (          JvNewStringUTF ("SO_REUSEADDR not supported"));#endif       break;    case _Jv_SO_TIMEOUT_ :      return new ::java::lang::Integer (timeout);      break;    default :      errno = ENOPROTOOPT;    } error:  char* strerr = strerror (errno);  throw new ::java::net::SocketException (JvNewStringUTF (strerr));}voidgnu::java::net::PlainSocketImpl::shutdownInput (void){  if (::shutdown (native_fd, 0))    throw new ::java::net::SocketException (JvNewStringUTF (strerror (errno)));}voidgnu::java::net::PlainSocketImpl::shutdownOutput (void){  if (::shutdown (native_fd, 1))    throw new ::java::net::SocketException (JvNewStringUTF (strerror (errno)));}

⌨️ 快捷键说明

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