Hallo,
die Länge wird nach dem Lesevorgang zurückgegeben.
Man macht dies normalerweise so, dass man ein Byte-Array erstellt, und in das hineinliest. Dann schreibt man in den Stream, und übergibt der Write-Methode die Länge, die die Read-Methode vom anderen Stream vorher zurückgegeben hat. z.B.
Dim buffer as Byte() = new Byte(10000) {}
Do While True
Dim readLen As Integer = strIn.Read(buffer, 0, buffer.Length)
If readLen <= 0 Then Exit Do
strOut.Write(buffer, 0, readLen)
Loop Wobei strIn der Stream ist, aus dem gelesen wird, und strOut der Stream, in den geschrieben wird.
Aufgrund deines vorherigen Beitrags, dass es nicht funktionieren würde, hab ich auch mal schnell in VB.Net ein Port-Forwarding-Programm probiert:
Option Strict On
Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Public Class TcpForwarder
Private ReadOnly Endpoint As IPEndPoint
Private ReadOnly ZielHost As String
Private ReadOnly ZielPort As Integer
Public Sub New(ByVal Endpoint As IPEndPoint, ByVal ZielHost As String, _
ByVal ZielPort As Integer)
Me.Endpoint = Endpoint
Me.ZielHost = ZielHost
Me.ZielPort = ZielPort
End Sub
Private Class Verbindung
Public ReadOnly ConServer As TcpClient
Public ReadOnly ConClient As TcpClient
Public Sub New(ConServer As TcpClient, ConClient As TcpClient)
Me.ConServer = ConServer
Me.ConClient = ConClient
End Sub
End Class
Public Sub Start()
Dim ServerListener As New TcpListener(Endpoint)
ServerListener.Start()
Do While True
Dim serverSock As TcpClient = ServerListener.AcceptTcpClient
Dim clientSock As New TcpClient()
Dim verb As New Verbindung(serverSock, clientSock)
'Empfangsthread
Dim t As New System.Threading.Thread(AddressOf StarteEmpfangen)
t.Start(verb)
Loop
End Sub
Private Sub StarteEmpfangen(ByVal verbObj As Object)
Dim verb As Verbindung = CType(verbObj, Verbindung)
' Ziel verbinden
verb.ConClient.Connect(ZielHost, ZielPort)
' Verbunden, also Thread starten, der vom Ziel empfängt
Dim t As New System.Threading.Thread(AddressOf Weiterleiten)
t.Start(New Stream() {verb.ConClient.GetStream(), _
verb.ConServer.GetStream()})
Weiterleiten(New Stream() {verb.ConServer.GetStream(), _
verb.ConClient.GetStream()})
End Sub
Private Sub Weiterleiten(ByVal StreamsObj As Object)
Dim Streams As Stream() = CType(StreamsObj, Stream())
Dim StrIn As Stream = Streams(0), StrOut As Stream = Streams(1)
Dim buffer As Byte() = New Byte(9999) {}
Try
Do While True
Dim readLen As Integer = StrIn.Read(buffer, 0, buffer.Length)
If readLen <= 0 Then Exit Do
' in Client schreiben
StrOut.Write(buffer, 0, readLen)
Loop
Catch Ex As IOException
'auch Verbindung geschlossen
End Try
' Verbindungsende
StrOut.Close()
End Sub
End Class Könnte aber sein, dass spezielle Exceptions noch nicht behandelt werden (und anhalten kann man ihn nicht).
Ein Aufruf erfolgt dann z.b. mit
Dim fwd As TcpForwarder = New TcpForwarder(New System.Net.IPEndPoint( _
System.Net.IPAddress.Any, 80), "www.google.de", 80)
fwd.Start() um eingehende Verbindungen auf dem Port 80 an Google weiterzuleiten.
Beitrag wurde zuletzt am 17.05.11 um 18:05:19 editiert. |