Socket.getInputStream.read(…) throws SocketException on Android when server sends FIN packet












0















I'm trying to implement a client application for Android that connects to a server using Socket, exchanges some data, and then terminates the connection in a graceful way, as described in this article:



https://docs.oracle.com/javase/8/docs/technotes/guides/net/articles/connection_release.html



However, the behavior of the client socket during disconnection does not behave as expected.




  1. We have established a connection between Android client and server.


  2. Client finishes sending all data and calls socket.shutdownOutput() (sends FIN to server).


  3. Server receives the last bytes and calls its socket.shutdownOutput() (sends FIN to client).



  4. Client reads the last bytes from the server and the last call to socket.getInputStream().read(...) throws the following exception:




    java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) with cause: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)





I expect the last call to socket.getInputStream().read(...) should return -1, which is the behavior I get when I run the same code on OpenJDK 11 on Ubuntu.



Is there some setting of Socket which could fix the behavior on Android?










share|improve this question

























  • Are you sure FIN is being sent by the server? FIN should not cause an ECONNRESET error. Is the client connecting to the server via LAN/WiFi or cellular?

    – Remy Lebeau
    Jan 18 at 23:42











  • @RemyLebeau I was trying it only in Android emulator, connecting to localhost machine (through 10.0.2.2 ip address). Maybe that is the cause? I tried Wireshark and it is clearly visible that it is FIN and no RST.

    – Martin Obrátil
    Jan 19 at 19:57













  • It looks like this is only happening on Android emulator running on my Ubuntu 18.04 installation. I tried it on Android emulator in Macos everything worked as expected - no exception was thrown.

    – Martin Obrátil
    2 days ago
















0















I'm trying to implement a client application for Android that connects to a server using Socket, exchanges some data, and then terminates the connection in a graceful way, as described in this article:



https://docs.oracle.com/javase/8/docs/technotes/guides/net/articles/connection_release.html



However, the behavior of the client socket during disconnection does not behave as expected.




  1. We have established a connection between Android client and server.


  2. Client finishes sending all data and calls socket.shutdownOutput() (sends FIN to server).


  3. Server receives the last bytes and calls its socket.shutdownOutput() (sends FIN to client).



  4. Client reads the last bytes from the server and the last call to socket.getInputStream().read(...) throws the following exception:




    java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) with cause: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)





I expect the last call to socket.getInputStream().read(...) should return -1, which is the behavior I get when I run the same code on OpenJDK 11 on Ubuntu.



Is there some setting of Socket which could fix the behavior on Android?










share|improve this question

























  • Are you sure FIN is being sent by the server? FIN should not cause an ECONNRESET error. Is the client connecting to the server via LAN/WiFi or cellular?

    – Remy Lebeau
    Jan 18 at 23:42











  • @RemyLebeau I was trying it only in Android emulator, connecting to localhost machine (through 10.0.2.2 ip address). Maybe that is the cause? I tried Wireshark and it is clearly visible that it is FIN and no RST.

    – Martin Obrátil
    Jan 19 at 19:57













  • It looks like this is only happening on Android emulator running on my Ubuntu 18.04 installation. I tried it on Android emulator in Macos everything worked as expected - no exception was thrown.

    – Martin Obrátil
    2 days ago














0












0








0








I'm trying to implement a client application for Android that connects to a server using Socket, exchanges some data, and then terminates the connection in a graceful way, as described in this article:



https://docs.oracle.com/javase/8/docs/technotes/guides/net/articles/connection_release.html



However, the behavior of the client socket during disconnection does not behave as expected.




  1. We have established a connection between Android client and server.


  2. Client finishes sending all data and calls socket.shutdownOutput() (sends FIN to server).


  3. Server receives the last bytes and calls its socket.shutdownOutput() (sends FIN to client).



  4. Client reads the last bytes from the server and the last call to socket.getInputStream().read(...) throws the following exception:




    java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) with cause: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)





I expect the last call to socket.getInputStream().read(...) should return -1, which is the behavior I get when I run the same code on OpenJDK 11 on Ubuntu.



Is there some setting of Socket which could fix the behavior on Android?










share|improve this question
















I'm trying to implement a client application for Android that connects to a server using Socket, exchanges some data, and then terminates the connection in a graceful way, as described in this article:



https://docs.oracle.com/javase/8/docs/technotes/guides/net/articles/connection_release.html



However, the behavior of the client socket during disconnection does not behave as expected.




  1. We have established a connection between Android client and server.


  2. Client finishes sending all data and calls socket.shutdownOutput() (sends FIN to server).


  3. Server receives the last bytes and calls its socket.shutdownOutput() (sends FIN to client).



  4. Client reads the last bytes from the server and the last call to socket.getInputStream().read(...) throws the following exception:




    java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) with cause: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)





I expect the last call to socket.getInputStream().read(...) should return -1, which is the behavior I get when I run the same code on OpenJDK 11 on Ubuntu.



Is there some setting of Socket which could fix the behavior on Android?







java android sockets tcp






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 18 at 23:40









Remy Lebeau

334k18254450




334k18254450










asked Jan 18 at 21:34









Martin ObrátilMartin Obrátil

4315




4315













  • Are you sure FIN is being sent by the server? FIN should not cause an ECONNRESET error. Is the client connecting to the server via LAN/WiFi or cellular?

    – Remy Lebeau
    Jan 18 at 23:42











  • @RemyLebeau I was trying it only in Android emulator, connecting to localhost machine (through 10.0.2.2 ip address). Maybe that is the cause? I tried Wireshark and it is clearly visible that it is FIN and no RST.

    – Martin Obrátil
    Jan 19 at 19:57













  • It looks like this is only happening on Android emulator running on my Ubuntu 18.04 installation. I tried it on Android emulator in Macos everything worked as expected - no exception was thrown.

    – Martin Obrátil
    2 days ago



















  • Are you sure FIN is being sent by the server? FIN should not cause an ECONNRESET error. Is the client connecting to the server via LAN/WiFi or cellular?

    – Remy Lebeau
    Jan 18 at 23:42











  • @RemyLebeau I was trying it only in Android emulator, connecting to localhost machine (through 10.0.2.2 ip address). Maybe that is the cause? I tried Wireshark and it is clearly visible that it is FIN and no RST.

    – Martin Obrátil
    Jan 19 at 19:57













  • It looks like this is only happening on Android emulator running on my Ubuntu 18.04 installation. I tried it on Android emulator in Macos everything worked as expected - no exception was thrown.

    – Martin Obrátil
    2 days ago

















Are you sure FIN is being sent by the server? FIN should not cause an ECONNRESET error. Is the client connecting to the server via LAN/WiFi or cellular?

– Remy Lebeau
Jan 18 at 23:42





Are you sure FIN is being sent by the server? FIN should not cause an ECONNRESET error. Is the client connecting to the server via LAN/WiFi or cellular?

– Remy Lebeau
Jan 18 at 23:42













@RemyLebeau I was trying it only in Android emulator, connecting to localhost machine (through 10.0.2.2 ip address). Maybe that is the cause? I tried Wireshark and it is clearly visible that it is FIN and no RST.

– Martin Obrátil
Jan 19 at 19:57







@RemyLebeau I was trying it only in Android emulator, connecting to localhost machine (through 10.0.2.2 ip address). Maybe that is the cause? I tried Wireshark and it is clearly visible that it is FIN and no RST.

– Martin Obrátil
Jan 19 at 19:57















It looks like this is only happening on Android emulator running on my Ubuntu 18.04 installation. I tried it on Android emulator in Macos everything worked as expected - no exception was thrown.

– Martin Obrátil
2 days ago





It looks like this is only happening on Android emulator running on my Ubuntu 18.04 installation. I tried it on Android emulator in Macos everything worked as expected - no exception was thrown.

– Martin Obrátil
2 days ago












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54261714%2fsocket-getinputstream-read-throws-socketexception-on-android-when-server-se%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54261714%2fsocket-getinputstream-read-throws-socketexception-on-android-when-server-se%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Callistus III

Ostreoida

Plistias Cous