myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[C#] Netzwerkprogrammierung - listen-Methode

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 30.08.12, 13:28   #1
Sn1G3
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 43
Bedankt: 33
Sn1G3 ist noch neu hier! | 0 Respekt Punkte
Standard [C#] Netzwerkprogrammierung - listen-Methode

Hallo Leute,

wofür ich die Listenmethode brauche ist mir klar. Aber was intern mit dem Socket passiert würde mich interessieren. Finde hierzu im Internet nichts. Also wenn ich Beispielsweise mit


Socket welcomeSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );

ein neues Socket erstelle. Dieses an eine IP-Adresse und eine Portnummer binde, mit


welcomeSocket.Bind(new IPEndPoint(IPAddress.Any,80));


(Was genau bewirkt IPAddress.Any eigentlich. Hier müsste doch eigentlich die IP-Adresse des Servers stehen)

und dann letztendlich lauschen lasse mit


welcomeSocket.Listen(10);


Meine Idee ist, das durch den Listen-Methodenaufruf im Socket irgendwie ein Flag gesetzt wird, so das bei einer Verbindungsanfrage durch den Client nicht direkt eine Verbindung initiiert wird, sondern erst mal auf den Accept-Methodenaufruf gewartet wird. Was meint ihr dazu? Über Antworten würde ich mich freuen.

Viele Grüße,

Sn1G3
Sn1G3 ist offline   Mit Zitat antworten
Ungelesen 30.08.12, 13:56   #2
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

"Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp )"
"AddressFamily.InterNetwork" steht für das Internetprotokoll (aber nicht für eine Adresse; hier könnte auch Unix für PIPE-Komuikation stehen oder File für ... eh klar ... oder ...);
"SocketType.Stream" steht für eine Stream ähnliche Verbindung (fast immer ist damit TCP gemeint);
"ProtocolType.Tcp" gibt das Transportprotokoll an (hier TCP, fast immer bei Stream)

Hier eine Erklärung zu den [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]. Auf dem [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] sieht man auch noch genauer den Ablauf.

Zwar heißen die Funktionen möglicherweise etwas anders, aber intern wird mit sehr großer Wahrscheinlichkeit genau so gearbeitet.

"IPAddress.Any" <- Steht für die Adresse auf die der Server lauscht ... dieser soll ja Verbindungen für jede (any) IP Adresse zu lassen (zumindest in den meisten Fällen).
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 30.08.12, 16:03   #3
Erebos76
Ist öfter hier
 
Benutzerbild von Erebos76
 
Registriert seit: Sep 2010
Beiträge: 276
Bedankt: 280
Erebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt Punkte
Standard

Zitat:
Zitat von Sn1G3 Beitrag anzeigen
Meine Idee ist, das durch den Listen-Methodenaufruf im Socket irgendwie ein Flag gesetzt wird, so das bei einer Verbindungsanfrage durch den Client nicht direkt eine Verbindung initiiert wird, sondern erst mal auf den Accept-Methodenaufruf gewartet wird. Was meint ihr dazu? Über Antworten würde ich mich freuen.
Ob ein Flag gesetzt wird, weiß ich nicht. Aber mit Sicherheit muss irgendwo das Socket als Listening-Socket markiert werden. Wenn ich mich richtig erinnere, werden alle Socket-Geschichten über die wsock32.dll abgewickelt, zu der es mittlerweile bestimmt auch eine 64-Bit-Version gibt.

Prinzipiell ist es aber richtig, daß das Socket im Listening-Mode nur Verbindungsanfragen bearbeitet und dann weiter den Port auf eingehende Verbindungen überwacht.

Verbindungsanfragen, die mit Accept() bearbeitet werden, erstellen ein neues Socket zur Verbindungsherstellung. Die [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] ist da auch sehr hilfreich.

Was hast Du denn mit Socket-Programmierung vor? Nur mal so neugierigerweise gefragt.
Erebos76 ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 00:12   #4
Sn1G3
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 43
Bedankt: 33
Sn1G3 ist noch neu hier! | 0 Respekt Punkte
Standard

Hey, danke für eure Antworten!
Zitat:
"IPAddress.Any" <- Steht für die Adresse auf die der Server lauscht ... dieser soll ja Verbindungen für jede (any) IP Adresse zu lassen (zumindest in den meisten Fällen).
Ich dachte, wenn ich ein Socket erstelle, wird dieses eindeutig durch Quell-IP und Quell-Port identifiziert und nicht durch eingehende IPs charackterisiert. ( ? ) Daher die Frage mit IPAddress.Any.

Zitat:
Was hast Du denn mit Socket-Programmierung vor? Nur mal so neugierigerweise gefragt.
Nett das du fragst Ich arbeite mich ein wenig in die Netzwerkthematik ein. Will erst mal nen kleinen Echo Server programmieren und dann nen Proxy. Ist es möglich meinen Echo Server an ein und demselben Rechner auszuprobieren? Ich frage, da ja letztendlich die selben IPs von Client und Server verwendet werden.

Viele Grüße,

Sn1G3
Sn1G3 ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 00:29   #5
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Viel über Netzwerktechnik zu lernen du noch hast ... (oder so ähnlich ).

127.0.0.1 oder localhost verwenden. Auf einem Server laufen ja auch mehrere Serveranwendungen (Web, Mail, DNS, DHCP, ...). Es Darf jedoch pro IP:Port kombination nur ein Programm lauschen (127.0.0.1:80 und 127.0.0.1:8080 geht und 127.0.0.1:80 und 127.0.0.2:80 auch). Zudem hast du ja auf dem loopback sogar 16777214 Adressen frei (von 127.255.255.254 bis 127.0.0.1) .

Ein Socket ist durch 5 Elemente vollständig definiert: Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll

IPAddress.Any bietet nur eine Hilfeleistung, damit du nicht Tausende Sockets erstellen/verwalten musst (das macht schon das OS/Kernel). Jedoch kann man mit diesem Socket (IPAddress.Any) keine Daten Senden, Empfangen. Ja nicht mal der 3-way handshake klappt. Er sagt nur dass eine Verbindung eingehen würde, mit der IP X und dem Port Y. Jetzt musst du mit accept() bestätigen dass du diesen willst. Dabei wird eine neuer/konkreter/voll definierter Socket erstellt. Mit diesen kannst du dann mit genau diesem einen Partner sprechen. Der Socket mit (IPAddress.Any) lauscht weiterhin auf andere eingehende Verbindungen.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 14:11   #6
Sn1G3
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 43
Bedankt: 33
Sn1G3 ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Viel über Netzwerktechnik zu lernen du noch hast ... (oder so ähnlich ).
Das stimmt wohl Will ich aber, denn ich finde das Thema sehr interessant!

Zitat:
Ein Socket ist durch 5 Elemente vollständig definiert: Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll
Dies gilt aber nur bei TCP-Sockets, bei UDP schauts nochmal anderst aus, oder?

Hier nochmal das welcomeSocket:

Socket welcomeSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
welcomeSocket.Bind(new IPEndPoint(IPAddress.Any,80));

Ich check immer noch nicht, woran ich das Socket binde. Gibt IPAddress.Any jetzt an, welche eingehenden IP-Adressen ich akzeptiere oder ist das die IP-Adresse des Servers (die Quell-IP)?
Auf MSDN steht Folgendes:
"Die Socket.Bind-Methode gibt über das Any-Feld an, dass eine Socket-Instanz die Clientaktivität an allen Netzwerkschnittstellen überwachen soll."
Was ist hier mit "allen Netzwerkschnittstellen" gemeint?

Meines erachtens würde zweiteres mehr Sinn machen... Wird dann das Paar Ziel-IP und Ziel-Port dann implizit beim akzeptieren der Anfrage an das Socket gebunden?

Grüße
Sn1G3 ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 15:16   #7
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Will wollte dich ja auch nicht aufhalten. Ich fand den Spruch nur gerade passend

Ein Socket ist eigentlich immer genau so Definiert. Jedoch müsse die verschiedenen Felder, bei den unterschiedlichen Sockets nicht immer das gleiche bedeuten. Bei einer pipe oder einem File gibt es ja z.B. keine IP.

Deine erste Vermutung ist richtig. Mit bind sagst du einfach dass das Socket für alle Pakete von der jeweiligen IP zum jeweiligen Port zuständig ist. Mit IPAddress.Any sagst du dass es dir egal ist wohler das Paket kommt, Hauptsache der Port stimmt.

Du könntest also mit Bind, verschiedenste IPs, unterschiedlich behandeln, ohne selbst immer überprüfen zu müssen, welche IP da gerade mit dir spricht.

Mit "allen Netzwerkschnittstellen" meinen sie, dass es egal ist, wie viele Netzwerkkarten du verbaut hast, es werden alle Gleichzeitig überwacht.

Die IP des Servers, musst du ja nicht Angeben, da diese ja eh durch die IP der jeweiligen Netzwerkkarte definiert ist (geht also von ganz alleine).

Ja, auch Ziel-IP und Ziel-Port wird automatisch gesetzt (von accept()).
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 16:02   #8
Sn1G3
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 43
Bedankt: 33
Sn1G3 ist noch neu hier! | 0 Respekt Punkte
Standard

Ah ok,Danke! Jetzt habe ich schon mehr verstanden. Dann könnte ich ja auf Serverseite rein theoretisch Einschränkungen bezüglich der akzeptierten Pakete vornehmen. Sprich, mit diesem Feld könnte ich festlegen, von welchen IPs/Clients ich überhaupt Anfragen akzeptiere. Ist das so richtig?
Aber ich könnte mir vorstellen, das die meisten Webserver hier IPAddress.Any stehen haben. Falls dem nicht so ist, kann ich an dieser Stelle irgendwelche Patterns festlegen, also das ich beispielsweise nur IPs von deutschen ISP akzeptiere?
Ich lese übrigens zum Thema passend das Buch "Computernetzwerke" von Kurose und Ross. Sehr zu empfehlen.
Grüße
Sn1G3 ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 16:28   #9
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Genau, der Standardfall nimmt einfach alles an (man ist ja nicht voreingenommen ). Es gäbe aber die Möglichkeit dich auf eine bestimmte IP festzulegen oder auf bestimmte Netze. Es ist halt die Frage, wie Sinnvoll das ganze dann eben ist. Sinnvoll ist es z.B. wenn man vorher schon Fix weiß, welche IP mit mir Sprechen wird (fast nur im LAN zu empfehlen) kann ich so ganz leicht sicher gehen, dass auch nur diese mit mir spricht und ich muss mir weniger Gedanken über Sicherheitskonzepte machen.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 17:06   #10
Sn1G3
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 43
Bedankt: 33
Sn1G3 ist noch neu hier! | 0 Respekt Punkte
Standard

Ok, so langsam nimmt das ganze in meinem Kopf Form an. Wenn ich ein lauschendes Socket dann an einen IPEndPoint binde, dann binde (sinnbildlich) ich den Server ja letztendlich nur an einen Port. Zusätzlich gebe ich damit an, auf welche eingehende Requests (IPs) dieses überhaupt reagieren soll. Die lokale IP wird dann implizit (ohne das ich was davon mitbekomme) an das Socket gebunden. Ist dies ebenfalls richtig?
Sn1G3 ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 17:30   #11
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Also es ist so, dass du dich nicht nur an einen Port bindest, sondern auch an eine IP. Jedoch sind bei IPs auch Bereiche möglich (besser gesagt Wildcards). Vom Verständnis her klappt es aber so wie du es gesagt hast.

Dein letzter Satz stimmt nicht ganz. Dein welcomeSocket-Objekt übernimmt nur die eingehenden Anrufe (nach deinen Angaben aus bind). Dies tut es aber erst nach dem du welcomeSocket.Listen() gemacht hast. Jedoch kann dein welcomeSocket-Objekt nicht arbeiten (antworten, Daten empfangen) da er nicht voll definiert ist. Dazu musst du mit welcomeSocket.Accept() ein neues Socket-Objekt erstellen. Dieses Spricht dann eben nur mit genau diesem einen Partner (IP).

welcomeSocket verwaltet also eine Liste aller Verbindungsanfragen. und Accept() gibt einen Socket aus dieser Liste zurück (erst jetzt ist eine volle Verbindung zustande gekommen). Wenn du den Socket den Accept() zurück gibt in einem eigenen Thread verarbeitest, kannst du so mehrere Verbindungen gleichzeitig verarbeiten. Ansonsten müssten die Anderen Partner immer warten, bis du mit dem anderen fertig bist.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 17:38   #12
Sn1G3
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 43
Bedankt: 33
Sn1G3 ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Dein letzter Satz stimmt nicht ganz. Dein welcomeSocket-Objekt übernimmt nur die eingehenden Anrufe (nach deinen Angaben aus bind). Dies tut es aber erst nach dem du welcomeSocket.Listen() gemacht hast. Jedoch kann dein welcomeSocket-Objekt nicht arbeiten (antworten, Daten empfangen) da er nicht voll definiert ist. Dazu musst du mit welcomeSocket.Accept() ein neues Socket-Objekt erstellen. Dieses Spricht dann eben nur mit genau diesem einen Partner (IP).

welcomeSocket verwaltet also eine Liste aller Verbindungsanfragen. und Accept() gibt einen Socket aus dieser Liste zurück (erst jetzt ist eine volle Verbindung zustande gekommen). Wenn du den Socket den Accept() zurück gibt in einem eigenen Thread verarbeitest, kannst du so mehrere Verbindungen gleichzeitig verarbeiten. Ansonsten müssten die Anderen Partner immer warten, bis du mit dem anderen fertig bist.
Ok das habe ich verstanden. Dein erster Satz ist mir noch nicht ganz klar. Was meinst du mit Bereichen bzw. Wildcards?

Ich habe jetzt mal nen kleine Echo-Server programmiert. Könnte ich dir den mal schicken, damit du mal kurz über den Quellcode schaust (und insbesodere ob auch die Kommentare richtig sind)? Ich glaube das wäre übersichtlicher wie das ganze hier im Forum zu posten.

Grüße
Sn1G3 ist offline   Mit Zitat antworten
Ungelesen 31.08.12, 18:09   #13
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Du kannst ihm eben sagen welche IPs du für den jeweiligen Port über haben willst (z.B. alle oder eben nur 192.168.0.1 - 192.168.0.254, oder ...). Aber wie schon gesagt, die meisten Server lassen eben alles zu (ist einfach so Standard). Also weniger Gedanke darüber machen. Du musst einfach nur wissen, dass du mit "IPAddress.Any" alle einkommenden Verbindungen für den Port X akzeptierst und somit an den Socket bekommst.

Also ich bin kein C# Proger (sondern C und C++), daher kann ich dir nicht sagen ob dein Programmierstiel passt. Aber ob du die Funkionen richtig verstanden hast, sollte ich hin bekommen.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 05.09.12, 14:32   #14
Erebos76
Ist öfter hier
 
Benutzerbild von Erebos76
 
Registriert seit: Sep 2010
Beiträge: 276
Bedankt: 280
Erebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt PunkteErebos76 leckt gerne myGully Deckel in der Kanalisation! | 332975 Respekt Punkte
Standard

Der Fred ist zwar schon was älter, aber mir ist da noch was eingefallen. Im Zusammenhang mit dem Proxy lohnt es sich, das Thema RFC durchzulesen, insbesondere der [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] für http.

Du gehst das alles so strukturiert an, da dachte ich es könnte Dich interessieren. Viel Erfolg weiterhin. :-)
Erebos76 ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.


Sitemap

().