Laden...

Tcp Send und Recieve -> Wie auf Antwort vom Server warten

Erstellt von Purm vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.134 Views
P
Purm Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren
Tcp Send und Recieve -> Wie auf Antwort vom Server warten

Hallo liebe leute 😉
Ich hab zwei (kleine?!?) Fragen bezüglich Tcp...
Ich hab folgende Variablen, und frage mich wie ich die im folgendem stil an einen server sende...

string ip = "100.0.1.100";//nur ne beispiel ip^^
int port = 80;
string paket = "hi ich bin das packet in mir ist eigentlich noch viel mehr drinne ;) ";

//und ich mächte sozusagen das hier machen:
TcpConnect(ip,port);
TcpSendePacket(paket);

//Und danach die "Antwort" vom Server empfangen:
WarteAufAnwort();
return TcpAnwort();

Hoffe ihr versteht was ich meine und könnt mir helfen... bin leider völliger netzwerk noob
danke mfg 😉

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Purm,

willkommen bei myCSharp.de

Hier ein Tutorial dazu: [Tutorial] Client-/Server-Komponente über TCP-Sockets
Du musst am Client warten bis du eine Antwort empfängst, Details dazu findest du im geposteten Tutorial.
Es gibt auch viele Technologien die dir da einiges an Arbeit abnehmen (z.B. WCF, Remoting usw.) aber diese sind für diesen Fall wohl etwas oversized.

Bitte beachte [Hinweis] Wie poste ich richtig? 1.1 und 1.1.1

Gruss
Michael

P
Purm Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

kk danke schonmal...
habe jetzt hier was gebastelt... funktioniert aber noch nicht vollständig...

also mein header bei version 1(will ne website kontaktieren)

string request = "http://google.de/" + Environment.NewLine + Environment.NewLine;
                request = request + "GET / HTTP/1.1" + Environment.NewLine;
                request = request + "Host: google.de" + Environment.NewLine;
                request = request + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13" + Environment.NewLine;
                request = request + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + Environment.NewLine;
                request = request + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + Environment.NewLine;
                request = request + "Accept-Encoding: gzip,deflate" + Environment.NewLine;
                request = request + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" + Environment.NewLine;
                request = request + "Keep-Alive: 115" + Environment.NewLine;
                request = request + "Connection: keep-alive" + Environment.NewLine;
                request = request + "Cookie: ";

--> mein ergebnis bei version 1...

Default HTML page on www.google.de:
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1350
Date: Fri, 17 Dec 2010 15:05:29 GMT
Server: GFE/2.0



<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>400 Bad Request</title>
<style><!--
body {font-family: arial,sans-serif}
div.nav {margin-top: 1ex}
div.nav A {font-size: 10pt; font-family: arial,sans-serif}
span.nav {font-size: 10pt; font-family: arial,sans-serif; font-weight: bold}
div.nav A,span.big {font-size: 12pt; color: #0000cc}
div.nav A {font-size: 10pt; color: black}
A.l:link {color: #6f6f6f}
A.u:link {color: green}
//--></style>
<script><!--
var rc=400;
//-->
</script>
</head>
<body text=#000000 bgcolor=#ffffff>
<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap>
<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font>&nbsp;&nbsp;</b>
<td>&nbsp;</td></tr>
<tr><td bgcolor="#3366cc"><font face=arial,sans-serif color="#ffffff"><b>Error</b></td></tr>
<tr><td>&nbsp;</td></tr></table>
<blockquote>
<H1>Bad Request</H1>
Your client has issued a malformed or illegal request.

<p>
</blockquote>
<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor="#3366cc"><img alt="" width=1 height=4></td></tr></table>
</body></html>

bei version 2:


                string  request = "GET / HTTP/1.1" + Environment.NewLine;
                request = request + "Host: google.de" + Environment.NewLine;
                request = request + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13" + Environment.NewLine;
                request = request + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + Environment.NewLine;
                request = request + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + Environment.NewLine;
                request = request + "Accept-Encoding: gzip,deflate" + Environment.NewLine;
                request = request + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" + Environment.NewLine;
                request = request + "Keep-Alive: 115" + Environment.NewLine;
                request = request + "Connection: keep-alive" + Environment.NewLine;
                request = request + "Cookie: ";

das ergebnis bei dieser version des headers ist gar nichts -.- er macht praktisch nichts... wartet "ewig" auf Rückgabe vom server...

Dann hier noch meine anfrage etc:

// Kodiere den string in Bytes
                Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
                // Lege ein Byte Array an für die zu emfangenden Daten
                Byte[] bytesReceived = new Byte[4096];

                // Instanziere ein gültiges Socket Objekt mit den übergebenen Argumenten
                sock = ConnectSocket(HttpToHost(Url), port);

                if (sock == null)
                    return ("Connection failed!");

                // Sende den HTTP-Request
                sock.Send(bytesSent, bytesSent.Length, SocketFlags.None);
                int bytes = 0;
                string page = "Default HTML page on " + HttpToHost(Url) + ":\r\n";

                // Empfange die Daten und konvertiere sie
                do
                {
                    
                    bytes = sock.Receive(bytesReceived, bytesReceived.Length, SocketFlags.None);
                    // kovertiere die Byte Daten in einen string
                    page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
                } while (bytes > 0);

                // Unterbinde alle weiteren Send() und Receive() Aktivitäten am Socket
                sock.Shutdown(SocketShutdown.Both);
                sock.Close();
                Clipboard.SetText(page);
                return page;

wäre extrem geil wenne mir hier noch weiterhelfen könntest... was ich da falsch mache 😉

danke nochmal mfg

EDIT: Bei version 2 des headers beim "nichtstun" scheint er bei den folgenden zeilen zu hängen:

do
                {
                    
                    bytes = sock.Receive(bytesReceived, bytesReceived.Length, SocketFlags.None);
                    // kovertiere die Byte Daten in einen string
                    page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
                } while (bytes > 0);

anscheinend sogar beim ersen durchlauf der schleife...

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

guck dir mal das Tutorial an welches ich vorhin verlinkt habe.
Das mag auf den ersten Blick zwar etwas heftig aussehen, aber dort kannst du dir die Information rausholen die du benötigst.

Zudem kannst du damit auch noch besser verstehen wie genau das ganze System funktioniert und was man beachten muss.

Für deine Fall ist diese Methode besonders interessant


/// <summary>
/// Wartet auf Daten vom Server.
/// Wurden innerhalb der Zeitspanne "TimeOut" (in ms) keine
/// Daten empfangen, wird null zurückgegeben, ansonsten ein
/// Byte-Array mit den empfangenen Daten.
/// </summary>
/// <returns>null oder ein Byte-Array mit empfangenen Daten</returns>
public byte[] receive()
{
    try
    {
        int cnt = 0;
        receiving=true;
        MemoryStream mem = new MemoryStream();// Empfangspuffer
        byte[] buffer = new byte[BufferSize];
        while (cnt<(TimeOut/SleepTime))
        {
            while (socket.Available>0)
            {
                int bytesRead = socket.Receive(buffer,buffer.Length,SocketFlags.None);
                if (bytesRead<=0) continue;
                mem.Write(buffer,0,bytesRead);
            }
            Thread.Sleep(SleepTime);
            if (mem.Length>0 && socket.Available==0)
            {
                receiving = false;
                return mem.ToArray();
            }
            else
            {
                cnt++;
            }
        }
        receiving=false;
        return null;
    }
    catch
    {
        receiving=false;
        return null;
    }
}

Diese wartet auf eine Antwort vom Server. Wird die Timeoutzeit überschritten dann gibt sie null zurück.

Bei dir müsste die Methode nahezu identisch aussehen.
Deine Schleife hat nicht funktioniert weil du abgefragt hast ob bytes > 0 ist was es beim ersten Durchlauf sicher nicht ist da der Server noch nichts gesendet hat, deshalb ist er sofort aus der Schleife gesprungen.

Gruss
Michael

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Dir ist aber schon aufgefallen, daß Du ein HTTP/1.0 400 Bad Request erhalten hast, weil Dein Request fehlerhaft ist?
Warum willst Du Dir es antun, den HTTP-Header zu Fuß selbst aufzubauen? Speziell für HTTP gibt es im Framework schon HttpWebRequest und WebClient, die könntest Du Dir mal ansehen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

P
Purm Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

ka einfach lern effekt unso,HttpWebRequest kenn ich auch..
@ mars weisst du denn auch, was daran falsch ist?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

ich denke sie erste Zeile ist zuviel.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

P
Purm Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

michlG hab ma versucht dein ansatz einzubauen, bekomm es aber nicht wirklich hin -.- kann mir jemand sagen warum ich das falsch machen pls, was daran falsch ist 😦

danke:

                // Kodiere den string in Bytes
                Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
                // Lege ein Byte Array an für die zu emfangenden Daten
                Byte[] bytesReceived = new Byte[4096];

                // Instanziere ein gültiges Socket Objekt mit den übergebenen Argumenten
                sock = ConnectSocket("www.google.de", port);

                if (sock == null)
                    return ("Connection failed!");

                // Sende den HTTP-Request
                sock.Send(bytesSent, bytesSent.Length, SocketFlags.None);
                string page = "Default HTML page on " + HttpToHost(Url) + ":\r\n";

                // Empfange die Daten und konvertiere sie
                int cnt = 0;
                int TimeOut = 5000;

                byte[] buffer = new byte[4096];
                MemoryStream mem = new MemoryStream();
                while (cnt < (TimeOut/100))
                {
                    while (sock.Available > 0)
                    {
                        int bytesRead = sock.Receive(buffer, buffer.Length, SocketFlags.None);
                        if (bytesRead <= 0) continue;
                        mem.Write(buffer, 0, bytesRead);
                    }
                    Thread.Sleep(100);
                    if (mem.Length > 0 && sock.Available == 0)
                    {
                        return mem.ToString();
                    }
                    else
                    {
                        cnt++;
                    }
                }

                // Unterbinde alle weiteren Send() und Receive() Aktivitäten am Socket
                sock.Shutdown(SocketShutdown.Both);
                sock.Close();
                Clipboard.SetText(page);
                return page;
1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

Interessant zur Beantwortung wäre, was genau nicht funktioniert?

Nobody is perfect. I'm sad, i'm not nobody 🙁

P
Purm Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

klar sry mein fehler >.<
er sleept halt bis zum timeout (sozusage) und gibt mir dann "Default HTML page on [...]"
aus (die nachricht ist oben definiert)

mfg

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo,

kann es sein, dass die Seite evtl. nicht innerhalb von 5sek. abgerufen werden kann?
Also ggf. mal den Timeout erhöhen.

Nobody is perfect. I'm sad, i'm not nobody 🙁

P
Purm Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

ne kann daran nicht liegen -.-
habs grad auf eine minute gestellt (!), normalerweise lädt der google bei mir in firefox auch in 1-2 sekunden^^..

EDIT: Es scheint irwas nicht am header zu stimmen, den ich sende... ich werd mir das nochmal genauer anschauen und dann hier posten, wenn ich weiter weiss 😉 danke für die bisherige hilfe

mfg

P
157 Beiträge seit 2010
vor 13 Jahren

Hast du bei deinem Header Content-Length gesetzt?