[C#] Verbindungsabfrage bei einem Socket funktioniert nicht richtig

  • Sehr geehrte Coder,


    ich versuche derzeit eine Verbindungsabfrage (bool) zu machen welche Prüft ob die Socket Verbindung steht.
    Die Abfrage soll true oder false ausgeben, es funktioniert eigentlich auch gut aber ab und zu spuckt er diesen Fehler aus:

    Zitat

    An unhandled exception of type 'System.ObjectDisposedException' occurred in System.dll
    Additional information: Auf das verworfene Objekt kann nicht zugegriffen werden.

    Code:

    Code
    static bool IsSocketConnected(Socket s)
            {            
                return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);     
            }


    Ich hoffe mir kann geholfen werden.

  • In der Console wird mir nichts ausgegeben außer:

    Zitat

    A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
    The thread 0x11b0 has exited with code 259 (0x103).
    The thread 0x410c has exited with code 259 (0x103).
    Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "System.Net.Sockets.Socket".The program '[16216] Client.vshost.exe' has exited with code 0 (0x0).


    Code:


    /edit
    Mit MessageBox.Show hat es geklappt dann kommt folgendes:

    PHP
    Auf das verworfene Objekt kann nicht zugegriffen werden.
  • Wenn die Fehlermeldung ab und zu auftaucht, du aber dennoch das richtige Ergebnis (also ob true oder false) zurückbekommst,
    dann kannst du es meineswissens auch ignorieren.


    Wäre dann so

    PHP
    static bool IsSocketConnected(Socket s) {
    	bool pool = false;
    	try {
    		pool = !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
    	} catch (ObjectDisposedException e) { }
    	return pool;            	
    }

  • public static void ConnectToSocket(string host, int port)
    {
    thi = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream,
    ProtocolType.Tcp);


    Console.WriteLine("Establishing Connection to {0}", host);
    // Verbinden & den Namen an den Server senden
    thi.Connect(host, port);


    RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Software\SAMP");
    string playerName = (string)registryKey.GetValue("PlayerName");


    byte[] msg = Encoding.UTF8.GetBytes(playerName);
    thi.Send(msg, SocketFlags.None);


    SocketConnect = true;


    Console.WriteLine("Connection established");
    }

    Hoffe das war damit gemeint. :)

  • private void CheckTimer_Trick(object sender, EventArgs e)
    {
    if (!IsProcessOpen("gta_sa"))
    {
    if (SocketConnect == true) thi.Close();
    }


    if (SocketConnect == true)
    {
    if (!IsSocketConnected(thi)) // <- here :)
    {
    this.Close();
    }
    }


    if(canJoin == true)
    {
    RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Software\SAMP");
    string regString = (string)registryKey.GetValue("gta_sa_exe");
    string gtaPatch = regString.Replace("gta_sa.exe", null);


    JoinGame(gtaPatch);
    canJoin = false;
    }
    }


  • Da haben wir das Problem. Du schließt den Socket, setzt aber nicht "SocketConnect" auf false. Dadurch wird "IsSocketConnected" aufgerufen mit einem Socket, der gar nicht mehr exisitert. Dadurch der Fehler


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen