{"id":6094,"date":"2016-12-19T15:28:11","date_gmt":"2016-12-19T20:28:11","guid":{"rendered":"http:\/\/appcrawler.com\/wordpress\/?p=6094"},"modified":"2016-12-19T16:14:40","modified_gmt":"2016-12-19T21:14:40","slug":"simulating-a-connection-reset-in-java","status":"publish","type":"post","link":"http:\/\/appcrawler.com\/wordpress\/2016\/12\/19\/simulating-a-connection-reset-in-java\/","title":{"rendered":"Simulating a connection reset in java"},"content":{"rendered":"<p>We start with a class that simply creates a server and a client.  The server class is configured to accept a connection and then exit, forcing of course, all connections to terminate.  The client class connects, then sleeps two seconds before attempting to read the stream from the now defunct server socket.<\/p>\n<pre>\r\nimport java.net.*;\r\nimport java.io.*;\r\n\r\npublic class ConnectionResetPOC {\r\n  public static void main(String[] args) throws Exception {\r\n    ServerSocket socket = new ServerSocket(19999);\r\n    System.out.println(\"Server Initialized\");\r\n    Socket connection = socket.accept();\r\n    System.out.println(\"received request\");\r\n    BufferedInputStream is = new BufferedInputStream(connection.getInputStream());\r\n    InputStreamReader isr = new InputStreamReader(is);\r\n    System.exit(1);\r\n    connection.close();\r\n  }\r\n}\r\n\r\nclass ConnectionResetClient {\r\n  public static void main(String argv[]) throws Exception {\r\n    Socket s = new Socket(\"172.26.248.147\", 19999);\r\n    PrintWriter out = new PrintWriter(s.getOutputStream(), true);\r\n    Thread.sleep(2000);\r\n    out.write(\"foobar\");\r\n    System.out.println(\"wrote string\");\r\n    BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));\r\n    System.out.println(input.read());\r\n  }\r\n}\r\n<\/pre>\n<p>We run our server class&#8230;<\/p>\n<pre>\r\nc:\\Users\\showard>java ConnectionResetPOC\r\nServer Initialized\r\nreceived request\r\n\r\nc:\\Users\\showard>\r\n<\/pre>\n<p>&#8230;and in another window run our client class.  This run results in a connection reset exception being thrown back to the client&#8230;<\/p>\n<pre>\r\nc:\\Users\\showard>java ConnectionResetClient\r\nwrote string\r\nException in thread \"main\" java.net.SocketException: Connection reset\r\n        at java.net.SocketInputStream.read(Unknown Source)\r\n        at java.net.SocketInputStream.read(Unknown Source)\r\n        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)\r\n        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)\r\n        at sun.nio.cs.StreamDecoder.read(Unknown Source)\r\n        at java.io.InputStreamReader.read(Unknown Source)\r\n        at java.io.BufferedReader.fill(Unknown Source)\r\n        at java.io.BufferedReader.read(Unknown Source)\r\n        at ConnectionResetClient.main(ConnectionResetPOC.java:26)\r\n\r\nc:\\Users\\showard>\r\n<\/pre>\n<p>Below we show a wireshark trace, in which the port 19999 on the server host (the same as the client in our simple POC) is shown as sending two RST packets back to the client&#8230;<\/p>\n<p><img alt='' class='alignnone size-full wp-image-6095 ' src='http:\/\/appcrawler.com\/wordpress\/wp-content\/uploads\/2016\/12\/img_5858416d02dc6.png' \/><\/p>\n<p>If needed, you can force network traffic to cross the network boundary on Windows with the following&#8230;<\/p>\n<pre>\r\nroute add client_computer mask 255.255.255.255 network_gateway metric 1\r\n<\/pre>\n<p>If you would like to even further test this, you can use a python server as shown below and obtain the same result&#8230;<\/p>\n<pre>\r\nimport socket, sys, random, struct\r\n\r\ns = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\r\nport = random.randint(3000,45000)\r\nport = 19999\r\ns.bind((socket.gethostname(), port))\r\ns.listen(10)\r\nprint \"started server on port \",port\r\nwhile 1:\r\n  conn, addr = s.accept()\r\n  l_onoff = 1\r\n  l_linger = 0\r\n  conn.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,struct.pack('ii', l_onoff, l_linger))\r\n  print 'Connected with ' + addr[0] + ':' + str(addr[1])\r\n  #data = conn.recv(2048)\r\n  data = \"steve\"\r\n  if not data:\r\n    break\r\n  conn.sendall(data)\r\n  conn.close()\r\n  print \"closed\"\r\ns.close()\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>We start with a class that simply creates a server and a client. The server class is configured to accept a connection and then exit, forcing of course, all connections to terminate. The client class connects, then sleeps two seconds&hellip;<\/p>\n<p class=\"more-link-p\"><a class=\"more-link\" href=\"http:\/\/appcrawler.com\/wordpress\/2016\/12\/19\/simulating-a-connection-reset-in-java\/\">Read more &rarr;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[7,56,73],"tags":[],"_links":{"self":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/6094"}],"collection":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/comments?post=6094"}],"version-history":[{"count":6,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/6094\/revisions"}],"predecessor-version":[{"id":6102,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/6094\/revisions\/6102"}],"wp:attachment":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/media?parent=6094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/categories?post=6094"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/tags?post=6094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}