Laden...

Anfrage senden per Socket über Port 80 bricht nach 30 Sekunden ab mit 0 Bytes

Erstellt von BlondyBoy vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.329 Views
B
BlondyBoy Themenstarter:in
9 Beiträge seit 2016
vor 6 Jahren
Anfrage senden per Socket über Port 80 bricht nach 30 Sekunden ab mit 0 Bytes

Hi

Ich habe ein kleine Client-Anwendung geschrieben bei der ich über einen Socket eine Verbindung zu einem Server (Geräte) im lokalen Netzwerk herstelle und versuche danach einen Befehl zyklisch zu senden.

Das Ganze sieht in etwa so aus:


public partial class myClass
{
        private Socket MyClient { get; set; }
        private bool MyClientWaitingForAnswer { get; set; }
        private byte[] MyClientReceiveBuffer { get; set; }
        private string MyClientReceive { get; set; }

        public myClass()
        {
            MyClientWaitingForAnswer = false;
            this.MyClientReceiveBuffer = new byte[256];

            InitializeComponent();
        }

        private void MyClientConnect_Click(object sender, EventArgs e)
        {
            try
            {
                if (IPAddress.Text == "")
                {
                    MessageBox.Show("Need IP address!", "Analog IO", MessageBoxButtons.OK);
                    return;
                }

                MyClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint MyIPEndPoint = new IPEndPoint(IPAddress.Parse(IPAddress.Text), 80);
                MyClient.BeginConnect(MyIPEndPoint , new AsyncCallback(MyClient_ConnectCallback), MyIPEndPoint );
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "MyClient", MessageBoxButtons.OK);
            }
        }

        private void MyClient_ConnectCallback(IAsyncResult ar)
        {
            try
            {
                MyClient = (Socket)ar.AsyncState;
                if (MyClient.Connected == true)
                {
                    MyClient.EndConnect(ar);
                    Invoke(new DelegateWithoutPara(MyClient_StartTimer));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "My Client", MessageBoxButtons.OK);
            }
        }

        public void MyClient_StartTimer()
        {
            t_MyClient = new System.Windows.Forms.Timer();
            t_MyClient.Interval = 500;
            t_MyClient.Tick += new EventHandler(t_MyClient_Handler);
            t_MyClient.Start();
        }

        private void t_MyClient_Handler(object sender, EventArgs e)
        {
            if (MyClientWaitingForAnswer == false)
            {
                if (MyClient != null)
                {
                    if (MyClient.Connected == true)
                    {
                        string strCommand = "GET /Single";
                        byte[] bCommand = Encoding.ASCII.GetBytes(strCommand);
                        MyClientWaitingForAnswer = true;
                        MyClient.BeginReceive(MyReceiveBuffer, 0, 255, SocketFlags.None, new AsyncCallback(MyClient_ReceiveCallback), MyClient);
                        MyClient.Send(bCommand);
                    }
                }
            }
        }

        private void MyClient_ReceiveCallback(IAsyncResult ar)
        {
            int iBytesRead = 0;

            try
            {
                if (MyClient.Connected == true)
                {
                    iBytesRead = MyClient.EndReceive(ar);
                    if (iBytesRead > 0)
                    {
                        MyClientReceive = "";
                        MyClientReceive = Encoding.ASCII.GetString(this.MyClientReceiveBuffer);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "My Client", MessageBoxButtons.OK);
            }

            if (iBytesRead == 0)
                this.Invoke(new DelegateWithoutPara(MyClient_Disconnect));

            this.MyClientWaitingForAnswer = false;
        }

        public void MyClient_Disconnect()
        {
            // Timer beenden
            if (t_MyClient != null)
            {
                this.t_MyClient.Stop();
                this.t_MyClient.Tick -= this.t_MyClient_Handler;
            }

            // Client schließen
            if (MyClient != null)
            {
                if MyClient.Connected)
                {
                    try
                    {
                        MyClient.Shutdown(SocketShutdown.Both);
                        MyClient.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "My Client", MessageBoxButtons.OK);
                    }
                }
            }
        }
}

Leider bekomme ich auf meine Anfrage keine Antwort. Nach etwa 30 Sekunden wird die Verbindung dann unterbrochen. Dann wird auch der ReceiveCallback ausgelöst, allerding mit 0 Bytes.

Wenn ich den Befehl den ich sende in die Adresszeile eines Internet Browsers eingebe:
"http://<IPAddress>/GET /Single"
bekomme ich eine entsprechende Antwort im Browser Fenster angezeigt.

Habe es zuerst über einen Router versucht, danach mittels direkter LAN-Verbindung. Auch die Windowsfirewall habe ich schon ausgeschaltet.
Wie schon erwähnt leider bekomme ich keine Antwort vom Server zurück.

Könnte es an meinem Code liegen? Wenn ja, wo habe ich etwas falsch gemacht oder übersehen?
Ich bin jetzt ein wenig Ratlos und weiß nicht mehr wirklich weiter.

Würde mich über jede Hilfestellung freuen.

P.S.: Ich habe noch einen anderen Server (Gerät) der über einen anderen Port angesprochen wird. Dort funktioniert alles wunderbar mit dem oben aufgeführten Code, lediglich Port und IP-Adresse ändern sich.

BlondyBoy

P
1.090 Beiträge seit 2011
vor 6 Jahren

Hi,

im Browser machst du einen HTTP Request. Wenn du es aus dem Quellcode machen willst kannst du den HTTP-Client verwenden.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.833 Beiträge seit 2008
vor 6 Jahren

Es gibt einige Applikationen, die den Port 80 missbrauchen.

Neben dem IIS, der das gezielt macht, weil er es muss, sperrt sich zum Beispiel Skype den Port 80 für Datenübertragungen.
Verwende einen Port, der freigegeben und frei ist.

Führ netstat -a -b als Admin auf der Console aus, dann siehst Du, ob Port 80 von einer anderen Applikation bereits verwendet wird.
Wenn nicht, dann liegt das Problem evtl. wo anders.

B
BlondyBoy Themenstarter:in
9 Beiträge seit 2016
vor 6 Jahren

Hi

Ich danke Euch für Eure Hilfestellungen.
Habe jetzt einfach mal dem Server (Gerät) einen anderen Port für HTTP zugewisen und siehe da, nachdem ich den Port in meinem Code drauf angepasst hatte funktionierte es wunderbar.

@Abt: Es sieht ja so aus als würde da etwas den Port blocken, obwohl es über die Internet Browser funktioniert. Habe auch mal 'netstat -a -b' ausgeführt. Aber da kommt so viel, dass die Console das dann irgendwann nicht mehr anzeigen kann. Kann man das irgendwie etwas einschränken?

Den HttpClient werde ich auch nochmal versuchen. Vielleicht klappt es ja damit.

BlondyBoy