Avatar billede d34c0n Praktikant
23. april 2006 - 00:43 Der er 17 kommentarer og
1 løsning

crappy IRC message parser!!

hej kan nogen hjælpe mig med denne IRC msg parser jeg prøvede at lave... kan ikke se hvor fejlen.. altså ingen compiler fejl men den virker ikke. og ja ved godt den er crappy coded men what ever.

------

            if (strstr(receive, "PRIVMSG"))
            {

                char from[256] = {0};
                int ifrom = 0;

                for (int i=1;i<strlen(receive);i++)
                {
                    if (receive[i] == '!')
                        break;
                    else
                        from[ifrom] = receive[i];

                    ifrom++;
                }

                char to[256];
                int ito = 0, icount=0;

                for (int ii=0;i<strlen(receive);ii++)
                {
                    if (receive[ii  ] == 'P' && receive[ii+1] == 'R' && receive[ii+2] == 'I' &&
                        receive[ii+3] == 'V' && receive[ii+4] == 'M' && receive[ii+5] == 'S' &&
                        receive[ii+6] == 'G' && receive[ii+7] == ' ')
                        {
                            ito = ii+8;
                            break;
                    }
                }

                char msg[256];
                int imsg = 0;

                for (int iii=ito;iii<strlen(receive);iii++)
                {
                    msg[icount] = receive[iii];
                    icount++;
                }

                sprintf(printbuffer, "<%s -> %s>  %s\r\n", from, to, msg);
                printf(printbuffer);

            }
Avatar billede d34c0n Praktikant
23. april 2006 - 01:10 #1
nogen der kan hjælpe mig med at rette den?? og måske nogen tis til at optimere koden? :)
Avatar billede mxs Nybegynder
23. april 2006 - 03:28 #2
Hvad er det den skal lave deacon?
Avatar billede arne_v Ekspert
23. april 2006 - 03:46 #3
til inspiration:

#include <stdio.h>
#include <string.h>

void test(char *s)
{
    char from[256],to[256],msg[256],*p1,*p2;
    if(strstr(s,"PRIVMSG"))
    {
        p1 = strchr(s,'!');
        strncpy(from,s,p1-s);
        from[p1-s] = '\0';
        p2 = strstr(p1+1,"PRIVMSG ");
        strncpy(to,p1+1,p2-p1-1);
        to[p2-p1-1] = '\0';
        strcpy(msg,p2+8);
        printf("<%s -> %s>  %s\r\n", from, to, msg);
    }
}

int main()
{
  test("XXX!YYYPRIVMSG Dette er en test");
  return 0;
}
Avatar billede d34c0n Praktikant
23. april 2006 - 05:18 #4
den skal reagere på PRIVMSG fra irc og parse linjen igennem og derefter printe den ud som e.g. "<sigurd -> #minchannel> hejsa..>"
Avatar billede d34c0n Praktikant
23. april 2006 - 05:18 #5
ok arne_v kigger lige på det senere tak :)
Avatar billede d34c0n Praktikant
23. april 2006 - 05:22 #6
raw irc data for privmsg ser sådan ud (eksempel):

":sigurd!sigurd@blablahost.dk PRIVMSG #minchannel :hejsa.."
Avatar billede arne_v Ekspert
23. april 2006 - 05:22 #7
jeg kender ikke IRC så jeg ved ikke om "XXX!YYYPRIVMSG Dette er en test" er
helt rigtig, men teknikken kan ihvertfald bruges

skal det være pænt skal du teste på om strchr/strstr returnerer NULL fordi
formatet ikke passer
Avatar billede arne_v Ekspert
23. april 2006 - 05:24 #8
":sigurd!sigurd@blablahost.dk PRIVMSG #minchannel :hejsa.."

skal blive til

from=sigurd
to=#minchannel
msg=hejsa..

?
Avatar billede arne_v Ekspert
23. april 2006 - 05:37 #9
#include <stdio.h>
#include <string.h>

void test(char *s)
{
    char from[256],to[256],msg[256],*p1,*p2,*p3,*p4,*p5;
    if(strstr(s,"PRIVMSG"))
    {
        p1 = strchr(s,':');
        p2 = strchr(p1+1,'!');
        strncpy(from,p1,p2-p1);
        from[p2-p1] = '\0';
        p3 = strchr(p2+1,' ');
        p4 = strstr(p3+1,"PRIVMSG ");
        p5 = strchr(p4+8,':');
        strncpy(to,p4+8,p5-p4-8);
        to[p5-p4-8] = '\0';
        strcpy(msg,p5+1);
        printf("<%s -> %s>  %s\r\n", from, to, msg);
    }
}

int main()
{
  test(":sigurd!sigurd@blablahost.dk PRIVMSG #minchannel :hejsa..");
  return 0;
}
Avatar billede d34c0n Praktikant
23. april 2006 - 15:56 #10
den ser ud til at lukke mit program ned ligesom den kode jeg selv havde før..
det er det jeg ikke forstår.. jeg har printer "connected." efter min socket er connected, og nede i bunden af min main() printer jeg "disconnected" før return 0..
for at tjekke om den faktisk bryder min while() loop for at modtage data, og det gør den ikke. den lukker bare ned??
Avatar billede d34c0n Praktikant
23. april 2006 - 16:02 #11
http://nse2005se.1go.dk/ircrawdata.bmp
her kan du se noget af den raw data jeg modtager normalt
Avatar billede arne_v Ekspert
24. april 2006 - 05:45 #12
"lukker bare ned" ?

crasher programmet ?
Avatar billede d34c0n Praktikant
25. april 2006 - 03:16 #13
nej ikke crasher.. lukker ned ligesom når du laver en return i main..?
Avatar billede arne_v Ekspert
25. april 2006 - 03:29 #14
jamen det har da ikke noget med parse funktionen at gøre - det må da skyldes resten
af programmet
Avatar billede d34c0n Praktikant
26. april 2006 - 05:17 #15
ja det ved jeg godt.. :( lav et svar arne
ps kan du gå udpege lidt af hvordan den virker din funktion? kender ikke noget til strchr() og strncpy() <- men den kan jeg vist regne ud hvad gør..
Avatar billede arne_v Ekspert
26. april 2006 - 13:25 #16
strchr(s,' ') returnerer en pointer til det første ' ' i s

strstr(s,"abc") returnerer en pointer til det første "abc" i s

strncpy virker ligesom strcpy nortset fra at den maksimalt kopierer antal tegn
som er angivet i 3. argument
Avatar billede arne_v Ekspert
26. april 2006 - 13:25 #17
og svar
Avatar billede d34c0n Praktikant
28. april 2006 - 20:29 #18
tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester