Hilfe zu System.Net.Sockets -> TCP

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SysOp1.

    Hilfe zu System.Net.Sockets -> TCP

    Hallo ihr Lieben,
    ich hatte bereits ein Thema eröffnet, indem ich fast die selbe Problematik beschrieb.
    Nur war dies zu unausführlich und ich selbst wusste nicht einmal was das hauptsächliche Problem ist.
    Nach 8-Std. Schlaf funktionierte die Birne wieder und ich wusste wie ich einige Sachen umschreiben muss! :)

    Also es geht um folgendes, ich versuche ein sehr veraltetes Visual Basic 6.0 Projekt auf den neuen Stand von VB.NET zu bringen.
    Das Projekt ist ein Gameserver für ein Browserspiel und ich habe sau viele Probleme, mein Nachteil ist das ich mit Visual Basic damals viel mehr gearbeitet habe als jetzt mit VB.NET und der derzeitige Code vom veralteten Projekt ist saumäßig aufgebaut.

    Ich habe bereits das Forum durchsucht und eine Menge Tutorials sowie Erklärungen gefunden die sehr hilfreich waren nur nicht speziell bzw. direkt für mein Anliegen.

    Ich verstehe diesen Teil z.B nicht (Visual Basic 6.0):
    - Es wird ein Winsock Control für alles genutzt.

    Visual Basic-Quellcode

    1. Private Sub socket_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    2. If Index = 0 Then
    3. Dim NewI As Integer
    4. If FreeSockets = "" Then
    5. NewI = SockI + 1
    6. SockI = SockI + 1
    7. Load socket(NewI)
    8. Load TimerUpdate(NewI)
    9. Load TimerTeleport1(NewI)
    10. Load TimerTeleport2(NewI)
    11. Load TimerTeleport3(NewI)
    12. Load TimerVote(NewI)
    13. Load TimerWave(NewI)
    14. Load TimerTalk(NewI)
    15. Load TimerGesture(NewI)
    16. Load TimerDrink(NewI)
    17. Load TimerVanish(NewI)
    18. Load UseTimer(NewI)
    19. Load TimerDC(NewI)
    20. ReDim Preserve Client(NewI)
    21. Else
    22. NewI = Replace(Split(FreeSockets, ">")(0), "<", "")
    23. FreeSockets = Replace(FreeSockets, "<" & NewI & ">", "")
    24. Unload socket(NewI)
    25. Load socket(NewI)
    26. End If
    27. On Error Resume Next
    28. TimerUpdate(NewI).Enabled = True
    29. socket(NewI).Accept requestID
    30. socket(NewI).SendData "@@" & Chr(1)
    31. End If
    32. End Sub


    Ich kann z.B 'If Index = 0 Then' nicht übernehmen!
    socket(xxxx) funktioniert natürlich auch nicht.
    Das Winsock Control in 6.0 hat diese Eigenschaft, nur habe ich in VB.NET kein Control dafür.

    Die Index-Eigenschaft ist doch eigentlich nur zum nummerieren geweseb und nutzbar als Schleifenvariable - wenn ich mich nicht Irre.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SysOp1“ ()

    Warum di If -Abfrage nicht funtioniert kann man vermutlich nur sagen wenn wir deine derzeitige Methode sehen. In .Net hast du 2 Moglichkeiten. Entweder du verwendest einen TcpListener oder du arbeitest direkt mit Socket Klasse (wenn ich mich nicht irre, eine Wrapper Klasse der WinSock Klasse).
    Erstmal vielen Dank für deine Antwort.
    Die If Abfrage müsste ja eigentlich funktionieren, ich habe mein hauptsächliches Problem wieder nicht erklären können, ich Idiot. :D

    Also 'Socket' & 'Client' wurden noch nicht definiert.

    Nehmen wir mal den Code aus dem Timer z.B:

    Visual Basic-Quellcode

    1. Private Sub ConnectionTimer_Tick(sender As Object, e As EventArgs) Handles ConnectionTimer.Tick
    2. If SockI < 1 Then Exit Sub
    3. For u = 1 To SockI
    4. If Socket.State = sckConnected Then
    5. Socket(u).SendData "@r" & Chr(1)
    6. If Client(u).Close = 1 Then
    7. If Client(u).InRoom > 0 Or Client(u).Publicnum > 0 Then
    8. Hab_Kick u
    9. End If
    10. Client(u).Hotelpos = "H"
    11. Socket(u).Close()
    12. If Client(u).Name <> "" Then Client(u).Name = ""
    13. If chckLog.Value = 1 Then
    14. If frmMain.chckLog.Value = 1 Then txtLog.Text = txtLog.Text & vbCrLf & "[" & u & "] ›› Closed"
    15. If frmMain.chckLog.Value = 1 Then txtLog.SelStart = Len(txtLog.Text)
    16. End If
    17. Else
    18. Client(u).Close = 1
    19. Socket(u).SendData "@r" & Chr(1)
    20. End If
    21. End If
    22. Next u
    23. End Sub


    Ich bin einfach nur verwirrt, Client(Index), Client(u), Client(b),Socket(u) etc.
    Meine Frage ist nun, wie definiere ich 'Socket' & 'Client' richtig um es auf diesem Wege zum laufen zu bringen?

    Edit: 'Client' hab ich herausgefunden aber 'Socket' noch nicht :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SysOp1“ ()

    Ich bin einfach nur verwirrt, Client(Index), Client(u), Client(b),Socket(u) etc.


    VB.NET-Quellcode

    1. ' Beispiel Socketarray
    2. Dim AvailaibleSockets_Array As Socket() = New Socket() {New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp), New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp), New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)}
    3. Console.WriteLine("Liste Socketarray auf...")
    4. For i As Integer = 0 To AvailaibleSockets_Array.Length - 1
    5. Console.WriteLine("Socket {0} verbinungsstatus: {1}", i, AvailaibleSockets_Array(i).Connected)
    6. Next


    Liste Socketarray auf...
    Socket 0 verbinungsstatus: False
    Socket 1 verbinungsstatus: False
    Socket 2 verbinungsstatus: False


    VB.NET-Quellcode

    1. ' Beispiel Sockets als generische Liste
    2. Dim AvailaibleSockets_ListOfT As New List(Of Socket)()
    3. AvailaibleSockets_ListOfT.AddRange(AvailaibleSockets_Array)
    4. Console.WriteLine("")
    5. Console.WriteLine("Liste Sockets als Generische -Liste auf...")
    6. For i As Integer = 0 To AvailaibleSockets_ListOfT.Count - 1
    7. Console.WriteLine("Socket {0} verbinungsstatus: {1}", i, AvailaibleSockets_ListOfT(i).Connected)
    8. Next


    Liste Sockets als Generische -Liste auf...
    Socket 0 verbinungsstatus: False
    Socket 1 verbinungsstatus: False
    Socket 2 verbinungsstatus: False


    Meine Frage ist nun, wie definiere ich 'Socket' & 'Client' richtig um es auf diesem Wege zum laufen zu bringen?

    Hier ist mal ein Auszug aus einer meiner .dll´s

    Spoiler anzeigen

    server

    C#-Quellcode

    1. /// <summary>
    2. /// Startet den Server Thread
    3. /// </summary>
    4. /// <returns>True wenn Server erfolgreich gestartet wurde, false wenn nicht</returns>
    5. public bool StartServer()
    6. {
    7. if (serverThread != null)
    8. StopServer();
    9. serverThread = new Thread(Run);
    10. serverThread.SetApartmentState(ApartmentState.STA);
    11. serverThread.Start();
    12. return true;
    13. }


    C#-Quellcode

    1. // Server -Listen
    2. private void Run()
    3. {
    4. if (ServerSocket == null)
    5. ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    6. // Connection socket
    7. Socket clientSocket = default(Socket);
    8. ServerSocket.Bind(new IPEndPoint(IPAddress.Any, Port));
    9. ServerSocket.Listen(1);
    10. IsRunning = true;
    11. // Event Feuern
    12. ServerStart(DateTime.Now, ServerSocket);
    13. while (IsRunning) {
    14. try { clientSocket = ServerSocket.Accept(); }
    15. catch (ThreadAbortException) { /* Wenn der Server geschlossen wird wird eine ThreadAbortExeption geworfen */ }
    16. catch (Exception ex) { ExceptionOccured(ex); }
    17. ConnectedClients.Add(CreateNewClientHandler(clientSocket, BufferSize));
    18. // Event Feuern
    19. ClientConnected(DateTime.Now, clientSocket);
    20. }
    21. }



    ClientHandler

    C#-Quellcode

    1. // Konstruktor
    2. public ClientHandler(Socket client, int bufferSize)
    3. {
    4. this.Socket = client;
    5. this.Socket.ReceiveTimeout = 1000;
    6. this.Socket.SendTimeout = 2000;
    7. iPollTimeOut = 1000;
    8. BufferSize = bufferSize;
    9. handlerThread = new Thread(ListenForCommand);
    10. handlerThread.Start();
    11. }


    C#-Quellcode

    1. /// <summary>
    2. /// Wartet auf eingehende Anfragen
    3. /// </summary>
    4. private void ListenForCommand()
    5. {
    6. Status = HandlerStatus.Idle;
    7. if (!ValidateSocket())
    8. return;
    9. IsReceiving = true;
    10. Byte[] buffer;
    11. while (IsReceiving)
    12. if (Socket.Connected) {
    13. try {
    14. if (Socket.Poll(iPollTimeOut, SelectMode.SelectRead)) {
    15. buffer = new Byte[BufferSize];
    16. Socket.Receive(buffer);
    17. TcpProtocol protocol;
    18. if (buffer.TryParse(out protocol))
    19. switch (protocol.Cmd) {
    20. case Command.Disconnect:
    21. ClientDisconnected(Socket, DateTime.Now, ClientName);
    22. this.Dispose();
    23. break;
    24. case Command.Identify:
    25. ReceiveDeviceInformation(protocol);
    26. break;
    27. }
    28. }
    29. }
    30. catch (SocketException ex) {
    31. SocketExceptionOccured(ex, Socket);
    32. ClientDisconnected(Socket, DateTime.Now, ClientName);
    33. Socket.Close(0);
    34. return;
    35. }
    36. }
    37. else { ClientDisconnected(Socket, DateTime.Now, ClientName); }
    38. }



    ClientStart

    C#-Quellcode

    1. public void Start()
    2. {
    3. IsRunning = false;
    4. if (ClientSocket == null) {
    5. ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    6. ClientSocket.ReceiveTimeout = ConnectionTimeOut;
    7. }
    8. try {
    9. IAsyncResult result = ClientSocket.BeginConnect(ServerIP, ServerPort, null, null);
    10. IsRunning = result.AsyncWaitHandle.WaitOne(ConnectionTimeOut, true);
    11. if (!IsRunning) {
    12. ClientSocket.Close(0);
    13. ClientSocket = null;
    14. // EventFeuern
    15. ConnectionFailed(ServerIP, new Exception("ConnectionTimeOut"));
    16. if (KeepTryConnectToServer)
    17. InitializeTimerConnectToServer();
    18. }
    19. else {
    20. // EventFeuern
    21. ClientConnected(ClientSocket, DateTime.Now);
    22. if (listenerThread != null) {
    23. listenerThread.Abort();
    24. listenerThread = null;
    25. }
    26. listenerThread = new Thread(IdentifyDevice);
    27. listenerThread.Start();
    28. }
    29. }
    30. catch (Exception ex) {
    31. // EventFeuern
    32. ConnectionFailed(ServerIP, ex);
    33. }
    34. }


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()