How to bind a socket to local wifi network address on Android?









up vote
2
down vote

favorite












I want to bind a socket to local wifi network address to make sure that requests are not running through 3g or other networks. I tried this code:



public static String getIpAddress(WifiManager wifiManager) 
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),
(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));


Socket socket = new Socket();
String localIpAddress = getIpAddress(wifiManager);
socket.bind(new InetSocketAddress(localIpAddress, 80));
socket.connect(new InetSocketAddress(serverHostname, serverPort), (int) timeoutMs);


And it throws:
java.net.BindException: bind failed: EACCES (Permission denied)
I checked permissions in Manifest. Looks like all needed permissions are granted:



<!-- Uses: show 'disconnected' message when not connected to the internet -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- Uses: record wifi network name when setting up a device -->
<!-- Uses: device wifi setup -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<!-- Uses: device wifi setup -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />









share|improve this question

























    up vote
    2
    down vote

    favorite












    I want to bind a socket to local wifi network address to make sure that requests are not running through 3g or other networks. I tried this code:



    public static String getIpAddress(WifiManager wifiManager) 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),
    (ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));


    Socket socket = new Socket();
    String localIpAddress = getIpAddress(wifiManager);
    socket.bind(new InetSocketAddress(localIpAddress, 80));
    socket.connect(new InetSocketAddress(serverHostname, serverPort), (int) timeoutMs);


    And it throws:
    java.net.BindException: bind failed: EACCES (Permission denied)
    I checked permissions in Manifest. Looks like all needed permissions are granted:



    <!-- Uses: show 'disconnected' message when not connected to the internet -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <!-- Uses: record wifi network name when setting up a device -->
    <!-- Uses: device wifi setup -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <!-- Uses: device wifi setup -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET" />









    share|improve this question























      up vote
      2
      down vote

      favorite









      up vote
      2
      down vote

      favorite











      I want to bind a socket to local wifi network address to make sure that requests are not running through 3g or other networks. I tried this code:



      public static String getIpAddress(WifiManager wifiManager) 
      WifiInfo wifiInfo = wifiManager.getConnectionInfo();
      int ipAddress = wifiInfo.getIpAddress();
      return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),
      (ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));


      Socket socket = new Socket();
      String localIpAddress = getIpAddress(wifiManager);
      socket.bind(new InetSocketAddress(localIpAddress, 80));
      socket.connect(new InetSocketAddress(serverHostname, serverPort), (int) timeoutMs);


      And it throws:
      java.net.BindException: bind failed: EACCES (Permission denied)
      I checked permissions in Manifest. Looks like all needed permissions are granted:



      <!-- Uses: show 'disconnected' message when not connected to the internet -->
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

      <!-- Uses: record wifi network name when setting up a device -->
      <!-- Uses: device wifi setup -->
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

      <!-- Uses: device wifi setup -->
      <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
      <uses-permission android:name="android.permission.INTERNET" />









      share|improve this question













      I want to bind a socket to local wifi network address to make sure that requests are not running through 3g or other networks. I tried this code:



      public static String getIpAddress(WifiManager wifiManager) 
      WifiInfo wifiInfo = wifiManager.getConnectionInfo();
      int ipAddress = wifiInfo.getIpAddress();
      return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),
      (ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));


      Socket socket = new Socket();
      String localIpAddress = getIpAddress(wifiManager);
      socket.bind(new InetSocketAddress(localIpAddress, 80));
      socket.connect(new InetSocketAddress(serverHostname, serverPort), (int) timeoutMs);


      And it throws:
      java.net.BindException: bind failed: EACCES (Permission denied)
      I checked permissions in Manifest. Looks like all needed permissions are granted:



      <!-- Uses: show 'disconnected' message when not connected to the internet -->
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

      <!-- Uses: record wifi network name when setting up a device -->
      <!-- Uses: device wifi setup -->
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

      <!-- Uses: device wifi setup -->
      <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
      <uses-permission android:name="android.permission.INTERNET" />






      java android sockets






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jul 5 '16 at 19:41









      Semyon Tikhonenko

      91111441




      91111441






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          You cannot bind to ports below 1024 without superuser access. So the Socket.bind() to port 80 is what is throwing an exception. Pick a custom port which is above 1024. For example, most user started web servers use port 8080.






          share|improve this answer




















            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',
            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%2f38211440%2fhow-to-bind-a-socket-to-local-wifi-network-address-on-android%23new-answer', 'question_page');

            );

            Post as a guest






























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            2
            down vote



            accepted










            You cannot bind to ports below 1024 without superuser access. So the Socket.bind() to port 80 is what is throwing an exception. Pick a custom port which is above 1024. For example, most user started web servers use port 8080.






            share|improve this answer
























              up vote
              2
              down vote



              accepted










              You cannot bind to ports below 1024 without superuser access. So the Socket.bind() to port 80 is what is throwing an exception. Pick a custom port which is above 1024. For example, most user started web servers use port 8080.






              share|improve this answer






















                up vote
                2
                down vote



                accepted







                up vote
                2
                down vote



                accepted






                You cannot bind to ports below 1024 without superuser access. So the Socket.bind() to port 80 is what is throwing an exception. Pick a custom port which is above 1024. For example, most user started web servers use port 8080.






                share|improve this answer












                You cannot bind to ports below 1024 without superuser access. So the Socket.bind() to port 80 is what is throwing an exception. Pick a custom port which is above 1024. For example, most user started web servers use port 8080.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jul 5 '16 at 19:51









                Larry Schiefer

                13.4k11829




                13.4k11829



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f38211440%2fhow-to-bind-a-socket-to-local-wifi-network-address-on-android%23new-answer', 'question_page');

                    );

                    Post as a guest














































































                    Popular posts from this blog

                    𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                    Edmonton

                    Crossroads (UK TV series)