Hallo,
ich habe heute versucht das erste Mal eine Netzwerkapplikation zu basteln. Dazu habe ich mit einem Dokumentierten Beispiel angefangen. Dieses funktioniert auch soweit, jedoch habe ich dazu mehrere Fragen. Ich habe natürlich schon selbst recherchiert, wodurch ich mir einige Fragen auch schon selbst beantworten konnte. Die restlichen kommen jetzt. Um meine Fragen besser stellen zu können poste ich erstmal den Code des Servers und Clients:
SERVER
Dim serverSocket As New Socket(Net.Sockets.AddressFamily.InterNetwork, _
Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.IP)
Dim clientsocket As Socket
Dim serverAddress As IPAddress = Dns.GetHostAddresses(Dns.GetHostName)(1)
Dim localEP As New IPEndPoint(serverAddress, 930)
serverSocket.Bind(localEP)
Try
'Socket aktivieren und auf Clientanruf warten
serverSocket.Listen(1)
Console.WriteLine("Ich warte auf einen Client...")
'Clientanfrage akzeptieren und einen clientspezifischen Socket anlegen
clientsocket = serverSocket.Accept()
Console.WriteLine("Verbindung zu einem Client enrfolgreich aufgebaut")
'Ausgabe der Verbindungsdaten zum Client
Dim port As Int32 = CType(clientsocket.RemoteEndPoint, IPEndPoint).Port
Dim tcpip As String = CType(clientsocket.RemoteEndPoint, _
IPEndPoint).Address.ToString
Console.WriteLine("Remote Daten: {0}/Port {1}", tcpip, port)
port = CType(clientsocket.LocalEndPoint, IPEndPoint).Port
tcpip = CType(clientsocket.LocalEndPoint, IPEndPoint).Address.ToString( _
)
Console.WriteLine("Lokale Daten: {0}/Port {1}", tcpip, port)
Catch ex As Exception
Console.WriteLine(ex.ToString())
Finally
clientsocket.Close()
End Try CLIENT
Dim serverSocket As New Socket(Net.Sockets.AddressFamily.InterNetwork, _
Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.IP)
Dim serverAddress As IPAddress = Dns.GetHostAddresses("MeinRechnerName")( _
1)
Dim remoteEP As New IPEndPoint(serverAddress, 930)
Try
'Verbindung zum TCP-Server aufnehmen
serverSocket.Connect(remoteEP)
Dim port As Int32 = CType(serverSocket.RemoteEndPoint, IPEndPoint).Port
Dim tcpip As String = CType(serverSocket.RemoteEndPoint, _
IPEndPoint).Address.ToString
Console.WriteLine("Lokale Daten: {0}/Port {1}", tcpip, port)
Catch ex As Exception
Console.WriteLine(ex.ToString)
Finally
serverSocket.Close()
End Try So nun zu den Fragen.
Bei der Server Applikation muss ich den serverSocket an meine IP-Adresse und einen von mir frei wählbaren Port binden.
Dazu muss ich erstmal meine IP-Adresse herausfinden. Im Beispielcode stand „Dns.GetHostAddresses(Dns.GetHostName)(0)“ und es wurde gesagt man soll einfach immer als Index 0 nehmen. Wenn ich das allerdings mache bekomme ich einen Fehler.
Wenn ich mit dem Debugger Dns.GetHostAddresses(Dns.GetHostName)(0).ToString auswerte bekomme ich etwas, das keiner IP-ähnliche ist.
Woher weiß ich nun welchen Index ich wählen muss. Bei mir passt Index 1, vielleicht bei einem Freund Index 0 oder 2.
Des weiteren habe ich auch bei folgendes Wikipedia gelesen:
„Im Beispiel von TCP/IP und UDP/IP ist bei einer Wildcard-Adresse nur die Port-Nummer relevant, es wird eine spezielle (ungültige) IP-Adresse angegeben, um zu signalisieren, dass Verbindungen auf allen IP-Adressen akzeptiert werden sollen.“
Dies ist natürlich viel besser als meine IP zu bestimmen. Gibt es auch eine Möglichkeit ein IPAdress-Objekt zu erstellen, das einer Wildcard-Adresse entspricht?
Nun zu meiner nächsten Fragen. Ich habe mir das Socket Konzept mehrmals durchgelesen und finde die Namengebung mehr als verwirrend. Ich will nun sichergehen, das ich das Konzept auch richtig verstanden habe.
Im Server code wird ja eine Variable clientsocket definiert. Doch das ist doch nicht der socket vom Client? Das ist doch immer noch ein serverSocket. Nur das dieser speziell für den neuen Client erzeugt wurde. Also ist das doch eher sowas wie serverSocket2? Hier ist das aber mit dem Namen nicht ganz so schlimm, womit ich aber gar nicht klarkomme ist im Client.
Warum wählt man hier den Namen serverSocket? Ich erstelle doch einen clientSocket und verbinde mit diesem zu der entsprechenden Adresse???
Und jetzt die letzte Frage. Ein Socket hat doch nicht zwei Enden?? Also was ist den dann bitte RemoteEndPoint und LocalendPoint.
Also soweit ich das verstanden habe hat beim server(code) der serversocket immer Port 930 und der clientSocket immer einen anderen als 930, sagen wir mal X. Und genau diesen müsste der serversocket im client(code) auch haben. Spielt man aber mit LocalendPoint und RemoteEnd Point so erhält man mal den mal den. Ich blicke da echt nicht durch.
Vielen Dank für alle Antworten !!!!!!!! |