c# Sockets i IRC

0

Witam,
Próbuję od niedawnego czasu napisać sobie prosty klient IRC jak na razie. Chodzi o odbieranie danych z kanału.
O ile z połączeniem do sieci freenode udało się zrobić, o tyle z ircnet.pl już jest problem. Trzeba bowiem odesłać PONG z odpowiednim kodem.
Problem w tym, ze nie mogę zmusić programu do odebrania tego kodu.
Prosty klient w pythonie działa, odbieram chyba wszystko co wysyła serwer, a w przypadku programu w C# dostaję tylko pierwszą linijkę, a przynajmniej tyle udaje mi się odebrać.
Oparłem to na

System.Net.Sockets.TcpClient().

Udaje się połączyć bo dostaję pierwszą wiadomość "looking up for ...".
I nic poza tym. Dopiero po jakimś czasie tylko informację o rozłączeniu z powodu braku odpowiedniej rejestracji (odesłaniu tego PONGa). W pythonie udało mi się to ogarnąć dość szybko, a w C# stoję i nie mogę dojść do czego.
Odbieranie robię w osobnym wątku, w pętli.
W przypadku freenode było w tej pętli coś takiego (uproszczone):

clientSocket.GetStream().Read(myReadBuffer, 0, myReadBuffer.Length);

Potem obrabiam to przez

 Encoding.ASCII.GetString[...]. 

Zacząłem próby z odczytywaniem niemalże bajt po bajcie i na tej jednej linijce nadal się kończyło. Chciałem dłużej poczekać i Stringa tworzyć dopiero później, też nic. Podobnie próby rozpisania tego na BeginReceive. Nawet wrzucenie Timeout = 1 niewiele daje.
Może mógłby mi ktoś podpowiedzieć jak odebrać tych kilka wiadomości wysyłanych niemalże pod rząd. Bo z pojedynczymi wysyłanymi w większym odstępie czasowym to nie ma problemu.
Z góry dzięki i pozdrawiam!
Adaśko.

0

Jakiego rozmiaru jest twój buffer. Zamieść cały kod jak to odbierasz.
PS. A ten PONG leci na pewno po TCP? Może sprawdź WireSharkiem co to takiego jest.

0
	private void ThreadReadMessage()
            {
                while (true)
                {
                    NetworkStream serverStream = default(NetworkStream);

                    try
                    {
                        serverStream = clientSocket.GetStream();
                    }
                    catch (Exception ee) { /* ... */ ThreadStop(); }
                    StringBuilder myCompleteMessage = new StringBuilder();

                    try
                    {
                        int numberOfBytesRead = 0;
                        byte[] myReadBuffer = new byte[1024];

                        do
                        {
                            numberOfBytesRead = serverStream.Read(myReadBuffer, 0, myReadBuffer.Length);

                            myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                        }
                        while (serverStream.DataAvailable);


                    }
                    catch (Exception ee) { /* ... */ ThreadStop(); }

                    NewData(myCompleteMessage.ToString());
                }
            }

PONG leci na ten sam port co pozostałe wiadomości.

0

Przede wszystkim powinieneś najpierw odbierać wszystkie bajty, a potem przerabiać na stringa. Jeżeli odbierasz w utf to możesz przy jednym przejściu odebrać jeden bajt jakiegoś znaku i dostać kolejny w następnym przejściu. W układzie jakim robisz możesz mieć przekłamania.

EDIT:
Pytanie czy ta funkcja jest wywoływana cyklicznie, czy na jakieś zdarzenie? Polecam korzystać z asynchronicznego BeginRead i EndRead

1 użytkowników online, w tym zalogowanych: 0, gości: 1