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 😉
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
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> </b>
<td> </td></tr>
<tr><td bgcolor="#3366cc"><font face=arial,sans-serif color="#ffffff"><b>Error</b></td></tr>
<tr><td> </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...
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
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
ka einfach lern effekt unso,HttpWebRequest kenn ich auch..
@ mars weisst du denn auch, was daran falsch ist?
Hallo,
ich denke sie erste Zeile ist zuviel.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
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;
Hallo!
Interessant zur Beantwortung wäre, was genau nicht funktioniert?
Nobody is perfect. I'm sad, i'm not nobody 🙁
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
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 🙁
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