jdk/src/java.base/windows/native/libnio/ch/DatagramChannelImpl.c
changeset 43100 a7e3457672c7
parent 25859 3317bb8137f4
equal deleted inserted replaced
43099:47f8baf1fcbd 43100:a7e3457672c7
    94     while(1) {
    94     while(1) {
    95         if (select(/*ignored*/fd+1, &tbl, 0, 0, &t) <= 0) {
    95         if (select(/*ignored*/fd+1, &tbl, 0, 0, &t) <= 0) {
    96             break;
    96             break;
    97         }
    97         }
    98         if (recvfrom(fd, buf, 1, MSG_PEEK,
    98         if (recvfrom(fd, buf, 1, MSG_PEEK,
    99                      (struct sockaddr *)&sa, &addrlen) != SOCKET_ERROR) {
    99                      &sa.sa, &addrlen) != SOCKET_ERROR) {
   100             break;
   100             break;
   101         }
   101         }
   102         if (WSAGetLastError() != WSAECONNRESET) {
   102         if (WSAGetLastError() != WSAECONNRESET) {
   103             /* some other error - we don't care here */
   103             /* some other error - we don't care here */
   104             break;
   104             break;
   105         }
   105         }
   106 
   106 
   107         recvfrom(fd, buf, 1, 0,  (struct sockaddr *)&sa, &addrlen);
   107         recvfrom(fd, buf, 1, 0, &sa.sa, &addrlen);
   108         got_icmp = JNI_TRUE;
   108         got_icmp = JNI_TRUE;
   109     }
   109     }
   110 
   110 
   111     return got_icmp;
   111     return got_icmp;
   112 }
   112 }
   120     SOCKETADDRESS sa;
   120     SOCKETADDRESS sa;
   121     int sa_len = sizeof(sa);
   121     int sa_len = sizeof(sa);
   122 
   122 
   123     memset(&sa, 0, sa_len);
   123     memset(&sa, 0, sa_len);
   124 
   124 
   125     rv = connect((SOCKET)fd, (struct sockaddr *)&sa, sa_len);
   125     rv = connect((SOCKET)fd, &sa.sa, sa_len);
   126     if (rv == SOCKET_ERROR) {
   126     if (rv == SOCKET_ERROR) {
   127         handleSocketError(env, WSAGetLastError());
   127         handleSocketError(env, WSAGetLastError());
   128     } else {
   128     } else {
   129         /* Disable WSAECONNRESET errors as socket is no longer connected */
   129         /* Disable WSAECONNRESET errors as socket is no longer connected */
   130         BOOL enable = FALSE;
   130         BOOL enable = FALSE;
   151         retry = FALSE;
   151         retry = FALSE;
   152         n = recvfrom((SOCKET)fd,
   152         n = recvfrom((SOCKET)fd,
   153                      (char *)buf,
   153                      (char *)buf,
   154                      len,
   154                      len,
   155                      0,
   155                      0,
   156                      (struct sockaddr *)&sa,
   156                      &sa.sa,
   157                      &sa_len);
   157                      &sa_len);
   158 
   158 
   159         if (n == SOCKET_ERROR) {
   159         if (n == SOCKET_ERROR) {
   160             int theErr = (jint)WSAGetLastError();
   160             int theErr = (jint)WSAGetLastError();
   161             if (theErr == WSAEMSGSIZE) {
   161             if (theErr == WSAEMSGSIZE) {
   180      * and port in DatagramChannelImpl then we don't need to
   180      * and port in DatagramChannelImpl then we don't need to
   181      * create InetAddress and InetSocketAddress objects.
   181      * create InetAddress and InetSocketAddress objects.
   182      */
   182      */
   183     senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
   183     senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
   184     if (senderAddr != NULL) {
   184     if (senderAddr != NULL) {
   185         if (!NET_SockaddrEqualsInetAddress(env, (struct sockaddr *)&sa,
   185         if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
   186                                            senderAddr)) {
       
   187             senderAddr = NULL;
   186             senderAddr = NULL;
   188         } else {
   187         } else {
   189             jint port = (*env)->GetIntField(env, this, dci_senderPortID);
   188             jint port = (*env)->GetIntField(env, this, dci_senderPortID);
   190             if (port != NET_GetPortFromSockaddr((struct sockaddr *)&sa)) {
   189             if (port != NET_GetPortFromSockaddr(&sa)) {
   191                 senderAddr = NULL;
   190                 senderAddr = NULL;
   192             }
   191             }
   193         }
   192         }
   194     }
   193     }
   195     if (senderAddr == NULL) {
   194     if (senderAddr == NULL) {
   196         jobject isa = NULL;
   195         jobject isa = NULL;
   197         int port;
   196         int port;
   198         jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
   197         jobject ia = NET_SockaddrToInetAddress(env, &sa, &port);
   199         if (ia != NULL) {
   198         if (ia != NULL) {
   200             isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
   199             isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
   201         }
   200         }
   202         CHECK_NULL_RETURN(isa, IOS_THROWN);
   201         CHECK_NULL_RETURN(isa, IOS_THROWN);
   203 
   202 
   204         // update cachedSenderInetAddress/cachedSenderPort
   203         // update cachedSenderInetAddress/cachedSenderPort
   205         (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
   204         (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
   206         (*env)->SetIntField(env, this, dci_senderPortID,
   205         (*env)->SetIntField(env, this, dci_senderPortID,
   207                             NET_GetPortFromSockaddr((struct sockaddr *)&sa));
   206                             NET_GetPortFromSockaddr(&sa));
   208         (*env)->SetObjectField(env, this, dci_senderID, isa);
   207         (*env)->SetObjectField(env, this, dci_senderID, isa);
   209     }
   208     }
   210     return n;
   209     return n;
   211 }
   210 }
   212 
   211 
   217                                           jobject destAddress, jint destPort)
   216                                           jobject destAddress, jint destPort)
   218 {
   217 {
   219     jint fd = fdval(env, fdo);
   218     jint fd = fdval(env, fdo);
   220     void *buf = (void *)jlong_to_ptr(address);
   219     void *buf = (void *)jlong_to_ptr(address);
   221     SOCKETADDRESS sa;
   220     SOCKETADDRESS sa;
   222     int sa_len;
   221     int sa_len = 0;
   223     jint rv = 0;
   222     jint rv = 0;
   224 
   223 
   225     if (NET_InetAddressToSockaddr(env, destAddress, destPort,
   224     if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
   226                                   (struct sockaddr *)&sa,
   225                                   &sa_len, preferIPv6) != 0) {
   227                                    &sa_len, preferIPv6) != 0) {
       
   228       return IOS_THROWN;
   226       return IOS_THROWN;
   229     }
   227     }
   230 
   228 
   231     rv = sendto((SOCKET)fd,
   229     rv = sendto((SOCKET)fd, buf, len, 0, &sa.sa, sa_len);
   232                buf,
       
   233                len,
       
   234                0,
       
   235                (struct sockaddr *)&sa,
       
   236                sa_len);
       
   237     if (rv == SOCKET_ERROR) {
   230     if (rv == SOCKET_ERROR) {
   238         int theErr = (jint)WSAGetLastError();
   231         int theErr = (jint)WSAGetLastError();
   239         if (theErr == WSAEWOULDBLOCK) {
   232         if (theErr == WSAEWOULDBLOCK) {
   240             return IOS_UNAVAILABLE;
   233             return IOS_UNAVAILABLE;
   241         }
   234         }