Search code examples
c#androidtcpmaui

TCP server using maui c# works on Windows, don't work on Android


solved by changing the port to a higher port. I used 3333 but it looks like anyone higher than 1024 works

I am trying to move my TCP server to an Android device using maui. I tried to run a very simple TCP server on Android using maui.
the server works on Windows but not on Android. I get "System.Net.Sockets.SocketException: 'Permission denied'" on the "serverSocket.Start();"

the code

using System.Net.Sockets;
using System.Net;
using System.Text;

namespace terminal_only;

public partial class MainPage : ContentPage
{
    int count = 0;
    string read;
    TcpClient client;
    NetworkStream ns;
    TcpListener serverSocket;
    bool connstat;

    public MainPage()
    {
        InitializeComponent();
        startthread();
    }


    private void startthread()
    {
        Thread svrThread = new Thread(new ThreadStart(receiver)); svrThread.IsBackground = true; svrThread.Start();
        connstat = true;
    }

    private void receiver()
    {
        serverSocket = new TcpListener(IPAddress.Any, 85);// Convert.ToInt32(textBox1.Text));
        serverSocket.Start();
        while (true)
        {
            client = serverSocket.AcceptTcpClient();
            ns = client.GetStream();

            while (client.Connected && connstat)
            {
                try
                {
                    byte[] readmsg = new byte[100];
                    ns.Read(readmsg, 0, readmsg.Length);
                    read = Encoding.ASCII.GetString(readmsg);
              //      textBox2.Invoke(new MethodInvoker(delegate () { textBox2.Text = textBox2.Text + "\r\n" + read; }));
                    byte[] msg = System.Text.Encoding.ASCII.GetBytes("gotit");
                    ns.Write(msg, 0, msg.Length);
                    /*                    if (client.Client.Poll(0, SelectMode.SelectRead))
                                        {
                                            byte[] buff = new byte[1];
                                            if (client.Client.Receive(buff, SocketFlags.Peek) == 0)
                                            {
                                                connstat = false;
                                            }
                                        }
                                    }*/
           //         textBox2.Invoke(new MethodInvoker(delegate () { textBox2.Text = textBox2.Text + "\r\nDisconnected"; }));
                    if (!connstat) break;
                }
                catch { }
            }
        }
        serverSocket.Stop();
        startthread();
    }
}

the error enter image description here

the manifest permissions

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-sdk android:minSdkVersion="21" />
</manifest>

Solution

  • solved by changing the port to a higher port. I used 3333 but it looks like anyone higher than 1024 works