Laden...

sockets frage (irc verbindung)

Erstellt von thejudge vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.051 Views
t
thejudge Themenstarter:in
94 Beiträge seit 2006
vor 16 Jahren
sockets frage (irc verbindung)

hallo

ich hab ne frage wegen sockets.. ich bau ne verbindung zu nem irc server über TcpClient auf und bekomm dann auch ne antwort, aber nich alle antworten.

 
 // ich versuch das über ne klasse zu machen
 // _tcpclient is nen TcpClient
 // _tcpread nen NetworkStream
                _tcpclient = new TcpClient();
                _tcpclient.Connect(_ircadress, _ircport);
                _tcpread = _tcpclient.GetStream();
                byte[] bytes = new byte[_tcpclient.ReceiveBufferSize];
                _tcpread.Read(bytes, 0, (int)_tcpclient.ReceiveBufferSize);
                string returndata = Encoding.UTF8.GetString(bytes);
                statuswindow.Text = statuswindow.Text + returndata;
 // das read hab ich mir aus der msdn library rausgesucht

was ich bekomm:
NOTICE AUTH 😗** Looking up your hostname

was ich bekommen sollte:
NOTICE AUTH 😗** Looking up your hostname
NOTICE AUTH 😗** Found your hostname, cached
NOTICE AUTH 😗** Checking Ident < und dann müsste ich die erste antwort senden

wie bekomm ich alle messages vom server?

btw das irc protokoll an sich is mir bekannt, hab das auch schonma in delphi gemacht (dort gabs nen event das immer getriggert ist, wenn ne message vom server kam, ich weiß halt nich wie das in c# funktioniert 🙁 )

wäre nett wenn mir das wer erklären könnte bzw mir hilfreiche links (tutorials zu dem thema geben könnte (das forum hier hab ich auch schon durchsucht aber nix hilfreiches gefunden))

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

heeeelp 🙁 (les grad mein thread und könnte etwas missverständlich sein) ich such nen weg connected zu bleiben bzw wie geh ich sicher dass ich alle messages vom server kriege die er mir sendet

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

so das is zwar schon ne ganze weile her, aber ich hab mich erst seit gestern wieder damit befasst und nun auch ne lösung gefunden.
ich poste hier einfach mal den code, da ich mir gut vorstellen kann, dass es noch mehrere leute mit diesem problem geben wird.


        #region IRCCONNECTION

        private Socket client;
        private byte[] data = new byte[4096];
        private delegate void Addmsgs(string msg);
        private event Addmsgs Addmsg;
        public void ircconnect()
        {
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("194.159.164.211"), 6668); //in diesem fall ein uk server
            newsock.Blocking = false;
            newsock.BeginConnect(iep, new AsyncCallback(OnConnect), newsock);
        }
        public void OnConnect(IAsyncResult ar)
        {
            client = (Socket)ar.AsyncState;
            try
            {
                client.EndConnect(ar);
                client.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), client);
            }
            catch (Exception)
            {
                MessageBox.Show("Es konnte keine Verbindung aufgebaut werden.", "Verbindungsfehler");
            }
        }
        public void OnReceive(IAsyncResult ar)
        {
            try
            {
                Socket remote = (Socket)ar.AsyncState;
                int recv = remote.EndReceive(ar);
                string receiveddata = Encoding.ASCII.GetString(data, 0, recv);
                Invoke(Addmsg, new string[] { receiveddata });
                remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public void OnSend(IAsyncResult ar)
        {
            try
            {
                Socket remote = (Socket)ar.AsyncState;
                int sent = remote.EndSend(ar);
                remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void IRCCommand(string msg)
        {
            richTextBox1.Text = richTextBox1.Text + msg + "\nNEU\n";
            if (Regex.IsMatch(msg, @"NOTICE AUTH \:\*\*\* Checking Ident"))
            {
                string send = "USER TESTER * * :nreal anyname\r\nNICK anyname\r\n";
                byte[] bytes = Encoding.ASCII.GetBytes(send);
                client.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnSend), client);
            }
            else if (Regex.IsMatch(msg, @"^PING :(\d+)"))
            {
                Match m = Regex.Match(msg, @"(\d+)");
                if (m.Success)
                {
                    byte[] bytes = Encoding.ASCII.GetBytes("PONG :"+m.Value+"\r\n");
                    client.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnSend), client);
                }
            }
        }

        #endregion

mit ircconnect(); startet die ganze sache. auf ner form sollte es eine richtextbox1 geben.
ins form1() muss noch

Addmsg = new Addmsgs(IRCCommand);

rein.

weitere commands senden:


        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                byte[] bytes = Encoding.ASCII.GetBytes(textBox1.Text+"\r\n");
                client.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnSend), client);
            }
        }

mfg

ps: falls wer was an dem code zu meckern hat, kann gerne verbesserungsvorschläge machen ;D

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.