C# Network TcpListener Import von vb.Net

Gotenks666

Ensign
Registriert
Mai 2009
Beiträge
165
Hallo Guten Tag,
ich suche schon seit ein paar Tagen nach einer Lösung und finde das Problem einfach nicht dazu.

Ich habe in Visual Basic.Net eine simple Server, Client Verbindung hergestellt die folgendermaßen aussieht:

[VB.NET]
Server:
Code:
public Class Client
    Public index As Integer
    Public IP As String
    Public Socket As TcpClient
    Public myStream As NetworkStream
    Public Closing As Boolean
    Private readBuff As Byte()

    Public Sub Start()
        Socket.SendBufferSize = 4096
        Socket.ReceiveBufferSize = 4096
        myStream = Socket.GetStream()
        ReDim readBuff(Socket.ReceiveBufferSize - 1)
        myStream.BeginRead(readBuff, 0, Socket.ReceiveBufferSize, AddressOf OnReceiveData, Nothing)
        Closing = False
    End Sub

    Private Sub OnReceiveData(ar As IAsyncResult)
        Try
            Dim readbytes As Integer = myStream.EndRead(ar)
            If Socket Is Nothing Then Exit Sub
            If (readbytes <= 0) Then
                CloseSocket(index) 'Disconnect
                Exit Sub
            End If
            Dim newBytes As Byte()
            ReDim newBytes(readbytes - 1)
            Buffer.BlockCopy(readBuff, 0, newBytes, 0, readbytes)
            HandleData(index, newBytes)
            If Socket Is Nothing Then Exit Sub
            myStream.BeginRead(readBuff, 0, Socket.ReceiveBufferSize, AddressOf OnReceiveData, Nothing)
        Catch ex As Exception
            CloseSocket(index) 'Disconnect
            Exit Sub
        End Try

    End Sub
End Class
Module ServerTCP
    Public Clients() As Client
    Public ServerSocket As TcpListener

    Public Sub InitNetwork()
        ServerSocket = New TcpListener(IPAddress.Any, 5555)
        ServerSocket.Start()
        ServerSocket.BeginAcceptTcpClient(AddressOf OnClientConnect, Nothing)
    End Sub

    Private Sub OnClientConnect(ar As IAsyncResult)
        Dim client As TcpClient = ServerSocket.EndAcceptTcpClient(ar)
        client.NoDelay = False
        ServerSocket.BeginAcceptTcpClient(AddressOf OnClientConnect, Nothing)
        For i = 1 To 100
            If Clients(i).Socket Is Nothing Then
                Clients(i).Socket = client
                Clients(i).index = i
                Clients(i).IP = DirectCast(client.Client.RemoteEndPoint, IPEndPoint).Address.ToString
                Clients(i).Start()
                TextAdd("Connection received from " & Clients(i).IP)
                NeedToUpDatePlayerList = True
                SendNews(i)
                Exit For
            End If
        Next
    End Sub
End Module

Client:
Code:
    Public Sub Connect()
        If Not PlayerSocket Is Nothing Then
            Try
                If PlayerSocket.Connected Or SckConnecting Then Exit Sub
                PlayerSocket.Close()
                PlayerSocket = Nothing
            Catch ex As Exception

            End Try
        End If
        PlayerSocket = New TcpClient()
        PlayerSocket.ReceiveBufferSize = 4096
        PlayerSocket.SendBufferSize = 4096
        PlayerSocket.NoDelay = False
        ReDim asyncBuff(8192)
        PlayerSocket.BeginConnect(Options.IP, Options.Port, New AsyncCallback(AddressOf ConnectCallback), PlayerSocket)
        SckConnecting = True
    End Sub

Dieses funktioniert ohne Probleme. Da ich momentan dabei bin C# lernen und alles konvertiere auf C#, habe ich folgendes Problem mit dem Server.
[C#]
Server:
Code:
 public class Client
    {
        public int index;
        public string IP;
        public TcpClient Socket;
        public NetworkStream myStream;
        public bool Closing;
        private byte[] readBuff;

public void Start()
        {
            Socket.SendBufferSize = 4096;
            Socket.ReceiveBufferSize = 4096;
            myStream = Socket.GetStream();
            readBuff = new byte[Socket.ReceiveBufferSize - 1 + 1];
            myStream.BeginRead(readBuff, 0, Socket.ReceiveBufferSize, OnReceiveData, null);
            Closing = false;
        }
}

ServerTCP.CS
Code:
public class ServerTCP
    {
        public static Client[] Clients;
        public static TcpListener ServerSocket;
        public static void InitNetwork()
        {
            ServerSocket = new TcpListener(IPAddress.Any, 5555);
            ServerSocket.Start();
            ServerSocket.BeginAcceptTcpClient(OnClientConnect, null);
        }

        private static void OnClientConnect(IAsyncResult ar)
        {
            TcpClient client = ServerSocket.EndAcceptTcpClient(ar);
            client.NoDelay = false;
            ServerSocket.BeginAcceptTcpClient(OnClientConnect, null);
            for (int i = 1; i <= 100; i++)
            {
                if (Clients[i].Socket == null)
                {
                    Clients[i].Socket = client;
                    Clients[i].index = System.Convert.ToInt32(i);
                    Clients[i].IP = System.Convert.ToString(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString());
                    Clients[i].Start();
                    Form1._Form1.AddText("Connection Received");
                    //NeedToUpDatePlayerList = true;
                    //SendNews(i);
                    break;
                }
            }
        }
    }

Sobald ich mit meinem konvertierten C# Client verbinde auf den C# Server zeigt Visual Studio mir folgenden Fehler:

Code:
if (Clients[i].Socket == null)
Der Index war außerhalb des Arraybereichs.

Habe ich einen Fehler im Konkretisierung Prozess oder habe ich etwas vergessen warum Clients OutOfIndex ist?

Viel dank für die Hilfe! Hoffe ich konnte genug Info geben!
 
Ohne jetzt tief auf den Sourcecode einzugehen: Dein "Clients"-Array hast du nirgends initialisiert und es ist deshalb null. Du versuchst aber darauf zuzugreifen, obwohl das Array leer ist. Dadurch dein Fehler.
 
Also das Array Clients hat schonmal keinen Inhalt/Daten und somit Länge 0. Deshalb gibt es denn Index Error zur laufzeit. Außerdem ist das Array nicht initialisiert. Hier wäre denke ich auch eine List besser.

Wenn du noch Clients.Add(client) hinzufügst müsste es eigentlich fuktionieren.
 
Müsste ich nicht

Clients[] Clients = new Clients; hinzufügen in die for-schleife oder verwechsel ich da gerade etwas?
 
dann überschreibst du jedes mal dein Clients-Array und machst es eigentlich nur mit jedem Durchlauf größer.
 
ah okay, nur verstehe ich nicht ganz was ich genau machen müsste wie ich den Clients-Array Initialisiere.
 
Entweder ein Array anlegen, das auf alle Fälle groß genug ist (das musst du wissen) oder eine List verwenden wie NeUs es vorgeschlagen hat und die darin enthaltene Add-Funktion nutzen.
Bei einem großen Array kannst bei deiner Art der Programmierung bleiben (die allerdings nicht sonderlich elegant ist)

Hier mal ein Beispiel der 2 Varianten:
https://stackoverflow.com/questions/202813/adding-values-to-a-c-sharp-array

Aber ein bisschen Eigeninitiative darfst du schon auch zeigen. Das sind jetzt wirklich keine großartig schweren Sachen. Da reichen 2 Sekunden googlen
 
Super ich danke, ich habe mein Problem gelöst in dem ich das dem InitNetwork() hinzugefügt habe. Hoffe dies ist einigermaßen richtig und korrekt. (Es funktioniert jedenfalls :p)

Code:
Clients = new Client[100 + 1];
            for (x = 1; x <= 100; x++)
            {
                Clients[x] = new Client();
            }
 
naja, fast.
1.
Deine Schleife fängt falsch an. x = 0 wäre richtig, sonst besetzt du ja den ersten Platz im Array nicht und es kommt potentiell zu einem Fehler, wenn du darauf zugreifst und dann eben null zurück bekommst.

2.
Auch moppelst du das jetzt irgendwie doppelt. Du hast das oben initialisiert und unten überschreibst du dann in deiner Schleife die Array-Einträge wieder indem du sie einzeln nochmal neu initialisierst. Ist das so beabsichtigt?

3.
Das 100 + 1 ergibt auch nicht wirklich Sinn. Mach 100 rein und gut ists.
 
rg88 schrieb:
naja, fast.
2.
Auch moppelst du das jetzt irgendwie doppelt. Du hast das oben initialisiert und unten überschreibst du dann in deiner Schleife die Array-Einträge wieder indem du sie einzeln nochmal neu initialisierst. Ist das so beabsichtigt?

Das ist nicht doppelt gemoppelt. Im ersten Schritt initialisiert er das Array mit 101 Feldern, die dann aber alle auf null stehen. Dann fügt er an den Stellen 1 bis 100 Objekte ein. Da spricht ja nicht dagegen, je nach Anwendungsfall.

Ansonsten sind natürlich Punkt 1 und 3 von von rg88 auch zu beachten. Gewöhn Dich lieber dran, dass Arrays, Listen etcs. bei 0 anfangen, sonst wirst Du irgendwann in unnötige Fehler laufen. Auf null zu prüfen kann natürlich meist auch nicht schaden...
 
Zuletzt bearbeitet:
Zurück
Oben