102 if (bufP != BUF) {
103 free(bufP);
104 }
105 return -1;
106 }
107
108 /*check if the socket has been closed while we were in timeout*/
109 newfd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
110 if (newfd == -1) {
111 JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
112 if (bufP != BUF) {
113 free(bufP);
114 }
115 return -1;
116 }
117 }
118 }
119
120 nread = recv(fd, bufP, len, 0);
121 if (nread > 0) {
122 (*env)->SetByteArrayRegion(env, data, off, nread, (jbyte *)bufP);
123 } else {
124 if (nread < 0) {
125 int err = WSAGetLastError();
126 // Check if the socket has been closed since we last checked.
127 // This could be a reason for recv failing.
128 if ((*env)->GetIntField(env, fdObj, IO_fd_fdID) == -1) {
129 JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
130 } else {
131 switch (err) {
132 case WSAEINTR:
133 JNU_ThrowByName(env, "java/net/SocketException",
134 "socket closed");
135 break;
136
137 case WSAECONNRESET:
138 case WSAESHUTDOWN:
139 /*
140 * Connection has been reset - Windows sometimes reports
141 * the reset as a shutdown error.
|
102 if (bufP != BUF) {
103 free(bufP);
104 }
105 return -1;
106 }
107
108 /*check if the socket has been closed while we were in timeout*/
109 newfd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
110 if (newfd == -1) {
111 JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
112 if (bufP != BUF) {
113 free(bufP);
114 }
115 return -1;
116 }
117 }
118 }
119
120 nread = recv(fd, bufP, len, 0);
121 if (nread > 0) {
122 JVM_callNetworkReadBytes(env, nread);
123 (*env)->SetByteArrayRegion(env, data, off, nread, (jbyte *)bufP);
124 } else {
125 if (nread < 0) {
126 int err = WSAGetLastError();
127 // Check if the socket has been closed since we last checked.
128 // This could be a reason for recv failing.
129 if ((*env)->GetIntField(env, fdObj, IO_fd_fdID) == -1) {
130 JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
131 } else {
132 switch (err) {
133 case WSAEINTR:
134 JNU_ThrowByName(env, "java/net/SocketException",
135 "socket closed");
136 break;
137
138 case WSAECONNRESET:
139 case WSAESHUTDOWN:
140 /*
141 * Connection has been reset - Windows sometimes reports
142 * the reset as a shutdown error.
|