Laden...

probleme mit incoming messages

Erstellt von thejudge vor 16 Jahren Letzter Beitrag vor 16 Jahren 910 Views
T
thejudge Themenstarter:in
94 Beiträge seit 2006
vor 16 Jahren
probleme mit incoming messages

hallo!

ich bin zur zeit wieder an meinem irc clienten. die verbindung/kommunikation funktioniert schon ganz gut. ich hab nur 2 probleme, für die ich irgendwie keine lösung finde.

  1. bei asynchronen sockets wird ja immer ein byte array gefüllt, das die benötigten infos zum auslesen der messages beinhaltet. mein problem ist: das array ist irgendwann mal voll und dann kommt "ArgumentOutOfRangeException". ich müsste das array also irgendwann mal leeren, weiss allerdings nicht, welchen teil ich entfernen kann/darf!

  2. manchmal passiert es, dass ich 2x den gleichen input erhalte, obwohl das eigtl nich sein kann! das passiert allerdings nur - so kommt es mir vor - wenn ich schnell viel input habe, also wenn man zb einen großen channel joined (in diesem fall sind zb nicknames doppelt/dreifach in der nicklist).

ich hoffe ihr könnt mir bei meinen problemen helfen. hier der entsprechende code:


        private byte[] data = new byte[4096];
        public void InitSocket()
        {
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.Blocking = false;
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("194.124.229.58"), 6667);
            client.BeginConnect(ipe, new AsyncCallback(OnConnect), client);
        }
        public void OnConnect(IAsyncResult ar)
        {
            Socket remote = (Socket)ar.AsyncState;
            remote.EndConnect(ar);
            remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
        }
        public void OnReceive(IAsyncResult ar)
        {
            Socket remote = (Socket)ar.AsyncState;
            int received = remote.EndReceive(ar);
            if (received == 0)
            {
                client.Close();
                return;
            }
            string receivedtext = Encoding.Default.GetString(data, 0, received); // <- hier wird dann die exception geworfen!
            sw.Invoke(Addmsg, new string[] { receivedtext });
            remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
        }
        public void OnSend(IAsyncResult ar)
        {
            Socket remote = (Socket)ar.AsyncState;
            int sent = remote.EndSend(ar);
            remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
        }

mfg

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.

T
thejudge Themenstarter:in
94 Beiträge seit 2006
vor 16 Jahren

*push*

sorry for push, aber ich bräuchte lösungen dafür, da ich sonst nich wirklich weitermachen kann 😦.

zu 1) finde ich absolut nichts.

bei 2) sieht es so aus, als müsste ich das ganze thread safe gestalten, aber wie kann ich das bei async sockets anstellen?

zur not vermutet einfach ;D

mfg

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.