Avatar billede jakobdo Ekspert
04. maj 2003 - 21:23 Der er 58 kommentarer og
1 løsning

Parse http header...

Hej,
jeg sidder og er i gang med at parse en HTTP header!

Jeg kan få følgende parset:

sscanf(buffer,"%GET %s HTTP",side)
side indeholder så / eller /index.html

Men længere nede i min header, kommer følgende string:

login=test&password=test

Hvordan får jeg det parset?

Har prøvet følgende:
sscanf(buffer,"login=%s&password=%s",login,password)
Men login og password er tomme!
Hvorfor??
Avatar billede arne_v Ekspert
04. maj 2003 - 21:30 #1
Manuel parsning !

:-(

char *p = strstr(buffer,"login=");
p = p + strlen("login=");
int i = 0;
while(p[i]!='&' && p[i]!='\0') {
  un[i]=p[i];
  i++;
}
un[i]='\0';

og tilsvarende for password.

[check lige - jeg har bare tastet direkte ind]
Avatar billede jakobdo Ekspert
04. maj 2003 - 21:53 #2
Du er den bedste Arne! :o)
Avatar billede jakobdo Ekspert
05. maj 2003 - 15:47 #3
Kan dette ikke laves bedre og lidt lettere:

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

int main()
{
    char login[11];
    char password[11];
    char submit[11];
    char *buffer = "GET / HTTP/1.1\r\nContent-Length: 123\r\nlogin=test&password=test&submit=login";
    int i;
   
    char *find = "login=";
    char *parse = strstr(buffer,find);
    parse = parse + strlen(find);
   
    i = 0;
    while(parse[i]!='&' && parse[i]!='\0')
    {
      login[i]=parse[i];
      i++;
    }
    login[i]='\0';
   
    find = "password=";
    parse = strstr(buffer,find);
    parse = parse + strlen(find);
   
    i = 0;
    while(parse[i]!='&' && parse[i]!='\0')
    {
      password[i]=parse[i];
      i++;
    }
    password[i]='\0';
   
    find = "submit=";
    parse = strstr(buffer,find);
    parse = parse + strlen(find);
   
    i = 0;
    while(parse[i]!='&' && parse[i]!='\0')
    {
      submit[i]=parse[i];
      i++;
    }
    submit[i]='\0';
   
    printf("Login: \t\t%s\n",login);
    printf("Password: \t%s\n",password);
    printf("Submit: \t%s\n",submit);
}
Avatar billede arne_v Ekspert
05. maj 2003 - 15:55 #4
#include <stdio.h>
#include <string.h>

int locate(char *buffer, char *namstr, char *valstr)
{
    int i;
    char *parse = strstr(buffer, namstr);
    if(parse==NULL) return 0;
    parse = parse + strlen(namstr);
 
    i = 0;
    while(parse[i]!='&' && parse[i]!='\0')
    {
      valstr[i]=parse[i];
      i++;
    }
    valstr[i]='\0';
    return 1;
}


int main()
{
    char login[11];
    char password[11];
    char submit[11];
    char *buffer = "GET / HTTP/1.1\r\nContent-Length: 123\r\nlogin=test&password=test&submit=login";
    locate(buffer, "login", login);
    locate(buffer, "password", password);
    locate(buffer, "submit", submit);
    printf("Login: \t\t%s\n",login);
    printf("Password: \t%s\n",password);
    printf("Submit: \t%s\n",submit);
}
Avatar billede jakobdo Ekspert
05. maj 2003 - 15:57 #5
Arne, har du ikke andet at lave end sidder herinde og hjælpe folk i nød? (og datadebile mennesker som mig?) :o)
Avatar billede arne_v Ekspert
05. maj 2003 - 16:02 #6
Jeg sidder faktisk på arbejde og kæmper med et problem.

Den slags her er en kærkommen afbrydelse/afveksling.
Avatar billede jakobdo Ekspert
05. maj 2003 - 16:18 #7
:o)

Jeg takker jo, det er altid rart at kunne få lidt hjælp! :o)
Avatar billede jakobdo Ekspert
11. maj 2003 - 19:09 #8
Arne_V:

Du skrev koden:

int locate(char *buffer, char *namstr, char *valstr)
{
    int i;
    char *parse = strstr(buffer, namstr);
    if(parse==NULL) return 0;
    parse = parse + strlen(namstr);

    i = 0;
    while(parse[i]!='&' && parse[i]!='\0')
    {
      valstr[i]=parse[i];
      i++;
    }
    valstr[i]='\0';
    return 1;
}

hvor jeg så har en buffer, som indeholder en httpheader, og deri bla. strengen:
submit=test

hvis jeg så kalder funktionen:
char* submit;
locate(buffer,"submit=",submit);
strlen(submit);

strlen giver en helt andet tal, end den burde, hvorfor??
svaret burde jo være 4, men hele headeren er med...
Avatar billede arne_v Ekspert
11. maj 2003 - 19:13 #9
Er der noget efter submit=test og det er det som er komet med ?
Avatar billede arne_v Ekspert
11. maj 2003 - 19:14 #10
Hvis det er tilfældet og der f.eks. er adskilt med \r\n, så
prøv og ændre til:

int locate(char *buffer, char *namstr, char *valstr)
{
    int i;
    char *parse = strstr(buffer, namstr);
    if(parse==NULL) return 0;
    parse = parse + strlen(namstr);

    i = 0;
    while(parse[i]!='&' && parse[i]!='\0' && parse[i]!='\r')
    {
      valstr[i]=parse[i];
      i++;
    }
    valstr[i]='\0';
    return 1;
}
Avatar billede jakobdo Ekspert
11. maj 2003 - 19:18 #11
Arne han er for cool.... :o)
Avatar billede jakobdo Ekspert
11. maj 2003 - 19:27 #12
Arne, det virker nogle gange! :o/

Nu får i lige hele min kode, er der nogle som kan se fejlen?

void* serveClient( void* socket )
{
    char buffer[512];
    char method[5];
    char submit[7];
    char html[1024];

    //HTML variabler
    char htmlTitle[20] = "<html><head><title>";
    char titleForm[42] = "</title></head><body><form method=POST>";
    char bodyHtml[15]  = "</body></html>";

    for(;;)
    {
        if (read( (int)socket, buffer, 1024) > 0 )
        {
            printf(buffer);
            locate(buffer, "submit=", submit); //Læser Buffer, og finder hvilken knap der er trykket!
            printf("\nSubmit=%s\n",submit);

            printf("strcmp=%d,strlen1=%d,strlen1=%d",strcmp(submit,"login"),strlen(submit),strlen("login"));

            if (strcmp(submit,"hentpost") == 0)
            {
                //Her kan brugeren hente sin post!...
                sprintf( html, "<html><head><title>HENTPOST</title></head><body><form method=POST><INPUT type=submit tabindex=1 name=submit value=hentpost><INPUT type=submit tabindex=2 name=submit value=logoff></form>%d</body></html>",getpid());
                sprintf( buffer, "HTTP/1.0 200 OK\r\nDate:Mon, 01 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n%s",strlen(html),html);
                write( (int)socket, buffer, strlen(buffer) );
                printf("hentpost\n");
            }
            else if (strcmp(submit,"login") == 0)
            {
                //Her testes om brugeren må logge ind...
                sprintf( html, "<html><head><title>LOGIN</title></head><body><form method=POST><INPUT type=\"submit\" tabindex=\"1\" name=\"Submit\" value=\"Update\"><INPUT type=\"submit\" tabindex=\"2\" name=\"Submit\" value=\"Logoff\"></form>%d</body></html>",getpid());
                sprintf( buffer, "HTTP/1.0 200 OK\r\nDate:Mon, 01 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n%s",strlen(html),html);
                write( (int)socket, buffer, strlen(buffer) );
                printf("login\n");
            }
            else if (strcmp(submit,"logoff") == 0)
            {
                //Brugeren logger af, vis evt kredit-side...
                sprintf( html, "<html><head><title>LOGOFF</title></head><body><form method=POST><INPUT type=\"submit\" tabindex=\"1\" name=\"Submit\" value=\"Update\"><INPUT type=\"submit\" tabindex=\"2\" name=\"Submit\" value=\"Logoff\"></form>%d</body></html>",getpid());
                sprintf( buffer, "HTTP/1.0 200 OK\r\nDate:Mon, 01 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n%s",strlen(html),html);
                write( (int)socket, buffer, strlen(buffer) );
                printf("logoff\n");
                close( (int)socket );
                pthread_exit( NULL );
            }
            else
            {
                //Sender startsiden...
                sprintf( html, "<html><head><title>STARTSIDE</title></head><body><form method=POST><input type=text tabindex=1 name=brugernavn><input type=text tabindex=2 name=password><INPUT type=submit tabindex=3 name=submit value=login></form>%d</body></html>",getpid());
                sprintf( buffer, "HTTP/1.0 200 OK\r\nDate:Mon, 01 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n%s",strlen(html),html);
                write( (int)socket, buffer, strlen(buffer) );
                printf("startside\n");
            }
        }
    }
}

/*****************************************************************************\
*                                                                            *
* Parser, finder en streng                                                    *
*                                                                            *
\*****************************************************************************/
int locate(char *buffer, char *namstr, char *valstr)
{
    int i;
    char *parse = strstr(buffer, namstr);
    if(parse==NULL) return 0;
    parse = parse + strlen(namstr);

    i = 0;
    while(parse[i]!='&' && parse[i]!='\0' && parse[i]!='\r')
    {
      valstr[i]=parse[i];
      i++;
    }
    valstr[i]='\0';
    return 1;
}

Mit problem er, at submit, skal indeholde det som findes via locate!
Jeg skulle gerne få følgende værdier, login, hentpost, logoff
Men det indeholder noget crap data...
Avatar billede arne_v Ekspert
11. maj 2003 - 19:40 #13
Prøv og erstat:

locate(buffer, "submit=", submit);

med:

if(!locate(buffer, "submit=", submit)) {
    printf("submit= not found in %s\n",buffer);
}
Avatar billede arne_v Ekspert
11. maj 2003 - 19:42 #14
Et gæt på hvad der kunne gå galt er at hvis din read læser det i
flere stykker:

".....sub"
"mit=...."

så kan locate ikke finde det.
Avatar billede arne_v Ekspert
11. maj 2003 - 19:44 #15
Løst og fast:

1)  Det vil nok under alle omstændiheder være godt at teste
    på retur værdien fra locate.

2)  Du bruger vist ikke:

    char htmlTitle[20] = "<html><head><title>";
    char titleForm[42] = "</title></head><body><form method=POST>";
    char bodyHtml[15]  = "</body></html>";

    men du kunne spare noget tælle arbejde med:

    char htmlTitle[] = "<html><head><title>";
    char titleForm[] = "</title></head><body><form method=POST>";
    char bodyHtml[]  = "</body></html>";

    så tæller C selv.
Avatar billede jakobdo Ekspert
11. maj 2003 - 20:18 #16
Min read, er en standard c funktion, så om den læser i stykker ved jeg ikke...
Men den læser jo http-headeren, og overholder den RFC821, ender hver linie jo med \r\n...
og så \r\n\r\n inden der kommer HTML...
Avatar billede jakobdo Ekspert
11. maj 2003 - 20:27 #17
Min readl læser jo det som en alm. browser sender!

Altså en GET / HTTP/1.1
blabla....
Eller POST / HTTP/1.1
blabla....

Så det burde jo stå rigtigt....

Read læser på en åben socket...
Avatar billede arne_v Ekspert
11. maj 2003 - 20:33 #18
Jo men du har ingen garanti for at den læser alt i en read eller
for at den deler pænt hvis der skal bruges flere read.

Prøv lige og se hvad:

if(!locate(buffer, "submit=", submit)) {
    printf("submit= not found in %s\n",buffer);
}

skriver ud ?
Avatar billede arne_v Ekspert
11. maj 2003 - 20:36 #19
Det kan løses ved at ændre koden til noget i retning af:

int n = 0;
int d;
do {
  d = read( (int)socket, buffer + n, 1024 - n);
  n += d;
} while(!locate(buffer, "submit=", submit));
Avatar billede jakobdo Ekspert
11. maj 2003 - 21:45 #20
Prøver det i morgen ARNE!
Hvad laver sådan en som dig, når du har tid til at hjælpe her på siden 24*7?

Jeg kan jo indrømme, at jeg læser datamatiker, og skal lave en webmail...
på linux, flere brugere samtidig....
Så derfor spørg jeg meget for tiden! :o)
Avatar billede arne_v Ekspert
11. maj 2003 - 21:54 #21
Jeg arbejder skam en 40-55 timer om ugen + har parcelhus/bil/kone/hund.
Avatar billede jakobdo Ekspert
12. maj 2003 - 19:17 #22
Hej arne,
ved første compilering, ser det ud til at virke fint...
Hvis jeg dog bruger denne:

int n = 0;
int d;
do {
  d = read( (int)socket, buffer + n, 1024 - n);
  n += d;
} while(!locate(buffer, "submit=", submit));

Står min browser bare og har følgende besked: Sending Request To Localhost...

Nu kan den rent faktisk fange LOGIN, men hvorfor bliver koden ikke sendt rigtigt...
Er der fejl i min if else if else, som skal kontrollere om det er login, hentpost, logoff osv..??
Avatar billede arne_v Ekspert
12. maj 2003 - 19:38 #23
Svært at sige.

Prøv evt. at finde ud af hvad der sker enten med en online debugger
eller med printf's.

En ide: output er måske cachet - prøv evt. at flushe med fsynch
Avatar billede jakobdo Ekspert
12. maj 2003 - 21:00 #24
Kan ikke finde fsynch på nettet, er det en standard C funktion?

Mener du ikke fflush()??
Avatar billede arne_v Ekspert
12. maj 2003 - 21:21 #25
Nej. Men det er fsync ikke fsynch.

fflush flusher en FILE*.

fsync flusher en int (file descriptor).

Den er erklæret i unistd.h på alle POSIX compliant systemer
(læs: alle ikke-Microosft systemer).
Avatar billede arne_v Ekspert
12. maj 2003 - 21:22 #26
Det var kun et gæt.
Avatar billede jakobdo Ekspert
12. maj 2003 - 22:11 #27
Ok! :o)
Avatar billede jakobdo Ekspert
13. maj 2003 - 19:55 #28
Hej Arne, så virker lortet sgu...
Avatar billede arne_v Ekspert
13. maj 2003 - 19:57 #29
fsync ?
Avatar billede jakobdo Ekspert
14. maj 2003 - 10:32 #30
Ja, altså hele min serveclient funktion, og jeg bruger FSYNC (har faktisk ikke testet om det virker uden) :o)
Avatar billede jakobdo Ekspert
14. maj 2003 - 14:07 #31
Hvad er der galt med følgende kode:

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

#define MAXSIZE 1024

char* htmlKode(char* kode,int type);

int main()
{   
    char buffer[1024];
   
    strcpy(buffer,htmlKode(htmlKode("Test",1),2));
    printf("%s\n",buffer);
}

char* htmlKode(char* kode,int type)
{
    char buffer[1024];
    switch (type)
    {
        case 0:
            sprintf(buffer,"<html>%s</html>",kode);
            break;
        case 1:
            sprintf(buffer,"<head>%s</head>",kode);
            break;
        case 2:
            sprintf(buffer,"<title>%s</title>",kode);
            break;
        case 3:
            sprintf(buffer,"<body>%s</body>",kode);
            break;
        case 4:
            sprintf(buffer,"<form method=post>%s</form>",kode);
            break;
        case 5:
            sprintf(buffer,"<INPUT type=submit name=submit value=%s>",kode);
            break;
        case 6:
            sprintf(buffer,"<INPUT type=submit name=%s>",kode);
            break;
        default:
            break;
    }
    return buffer;
}

Koden er lavet, så jeg skal kunne kalde min funktion htmlKode("HEJ",0);
Den skal så returnere <html>HEJ</html>
Dette virker!

Men jeg ville jo så gerne kunne gøre som følger:

htmlKode(htmlKode(htmlKode("HEJ",2),1),0)
Men her giver den mig ikke ønskede svar...

Jeg får et output som dette: <html>x¸&#8597;</html>
Men det skulle jo have været:
<html><head><title>HEJ</title></head></html>
Avatar billede arne_v Ekspert
14. maj 2003 - 14:14 #32
Du returnerer en lokal variabel i din funktion.

Det må man aldrig.
Avatar billede arne_v Ekspert
14. maj 2003 - 14:15 #33
Sludder.

Du returnerer adressen på en lokal variabel.

Det må man aldrig.

Man må godt returnere char/int/double whatever.

Men ikke array's.
Avatar billede arne_v Ekspert
14. maj 2003 - 14:16 #34
static char buffer[1024];

char* htmlKode(char* kode,int type)
{
    switch (type)
    {
        case 0:
            sprintf(buffer,"<html>%s</html>",kode);
            break;
        case 1:
            sprintf(buffer,"<head>%s</head>",kode);
            break;
        case 2:
            sprintf(buffer,"<title>%s</title>",kode);
            break;
        case 3:
            sprintf(buffer,"<body>%s</body>",kode);
            break;
        case 4:
            sprintf(buffer,"<form method=post>%s</form>",kode);
            break;
        case 5:
            sprintf(buffer,"<INPUT type=submit name=submit value=%s>",kode);
            break;
        case 6:
            sprintf(buffer,"<INPUT type=submit name=%s>",kode);
            break;
        default:
            break;
    }
    return buffer;
}

vil være korrekt C (men ikke nok til at løse dit problem).
Avatar billede arne_v Ekspert
14. maj 2003 - 14:18 #35
Du skal nok over i:

char* htmlKode(char* kode,int type,char *buffer)
{
    switch (type)
    {
        case 0:
            sprintf(buffer,"<html>%s</html>",kode);
            break;
        case 1:
            sprintf(buffer,"<head>%s</head>",kode);
            break;
        case 2:
            sprintf(buffer,"<title>%s</title>",kode);
            break;
        case 3:
            sprintf(buffer,"<body>%s</body>",kode);
            break;
        case 4:
            sprintf(buffer,"<form method=post>%s</form>",kode);
            break;
        case 5:
            sprintf(buffer,"<INPUT type=submit name=submit value=%s>",kode);
            break;
        case 6:
            sprintf(buffer,"<INPUT type=submit name=%s>",kode);
            break;
        default:
            break;
    }
    return buffer;
}

og:

int main()
{   
    char buffer1[1024];
    char buffer2[1024];
    printf("%s\n",htmlKode(htmlKode("Test",1,buffer1),2,buffer2));
}
Avatar billede jakobdo Ekspert
14. maj 2003 - 14:22 #36
Du returnere en char* på funktionen, men også buffer!

HER ------------------------------------ HER
char* htmlKode(char* kode,int type,char *buffer)

Kan jeg ikke lave den som:
int htmlKode(char* kode, int type, char* buffer)??
Avatar billede arne_v Ekspert
14. maj 2003 - 14:31 #37
Der er ikke noget til hinder for at returnere noget der også
er et argument.

Det ser lidt fjollet ud, men det er en god måde at
gøre det på når man skal klare situationer som denne hvor du vil
kalde en funktion med resulatet af et kald til samme funktion
som argument.
Avatar billede jakobdo Ekspert
14. maj 2003 - 14:38 #38
Arne, kan du ikke bare få mit oplæg til mit skole projekt, så kan du jo lige fikse det på et par minutter! (og jeg vil slippe for at stresse og rive mig i håret i tide og utide) :o)

Jeg fik dit program til at virke som jeg ønskede, det var ellers tæt på mit eget bud, men ikke helt!

Arne, du må give mig din adresse, så jeg kan sende en takke-gave, nu når mit projekt er færdigt... :o)
Avatar billede jakobdo Ekspert
14. maj 2003 - 20:44 #39
Hvad har jeg gjort galt her:

/*****************************************************************************\
*                                                                            *
* simple pop3 client                                                          *
*                                                                            *
\*****************************************************************************/
#define _REENTRANT
#include <stdio.h>                        //Standard C library for Input/Output with streams
#include <unistd.h>                        //standard symbolic constants and types
#include <sys/types.h>              //data types
#include <netdb.h>                        //definitions for network database operations
#include <sys/socket.h>             //Internet Protocol family
#include <netinet/in.h>             //Internet Protocol family

#define smtpPort 25                        //SMTP Port
#define pop3Port 110                    //POP3 Port
#define MAXSIZE 1024                    //MaxStørrelse på BUFFER

enum{false,true};

int popSvar(char *svar);

main(int argc, char *argv[])
{
    struct sockaddr_in s_a;
    struct hostent *host;
    int mailSocket;
    char buffer[MAXSIZE];
    char error[MAXSIZE];
    char mail[MAXSIZE];
    long len;
    if (argc != 3)
    {
        printf("Usage: client hostname port\n");
        return 0;
    }
    if ((mailSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("socket: no avaiable socket\n");
        return 1;
    }
    if (!(host = gethostbyname(argv[1])))
    {
        sprintf(error,"Host does not exist: %s\n", argv[1]);
        printf(error);
        return 2;
    }
    s_a.sin_addr.s_addr = *((long *) host->h_addr);
    s_a.sin_family = AF_INET;
    s_a.sin_port = htons(atoi(argv[2]));
    if (connect(mailSocket, (struct sockaddr *)&s_a, sizeof(s_a)) < 0)
    {
        printf("Cannot connect\n");
        return 3;
    }
    for (;;)
    {
        if (read( (int)mailSocket, buffer, 150) > 0 )
        {
            printf("%s",buffer);
            if (popSvar(buffer) == 1)
            {
                //printf("DEN ER OK\n");
                sprintf(mail,"user XXXXXX\n");
                write( (int)socket, mail, strlen(mail) );
                fsync( (int)socket);
                state = user;
            }
            else
            {
                printf("DEN ER IKKE OK\n");
                close( (int)socket );
            }
        }
    }
}

int popSvar(char *svar)
{
    int result = true;
    if (strncmp("+OK",svar,3) == 0)
        result = true;
    else
        result = false;
    return result;
}

Kører jeg min fil, sådan her: 1405mail pop.damgaard-olsen.dk 110
Får jeg kun følgende:
+OK Hello there.
Og så hænger den....
Den skulle jo ellers sende USER XXXXX (ENTER)
Men det sker åbenbart ikke...
Avatar billede arne_v Ekspert
14. maj 2003 - 20:55 #40
Prøv evt at send \r\n i.s.f. kun \n - bar en ide.
Avatar billede jakobdo Ekspert
14. maj 2003 - 20:59 #41
Hjælpe desværre ikke! :o(

Jeg har prøvet at lave følgende:

for (;;)
    {
        if (read( (int)mailSocket, buffer, 150) > 0 )
        {
            printf("%s\n",buffer);
            switch(state)
            {
                case welcome:
                    if (popSvar(buffer) == 1)
                    {
                        //printf("DEN ER OK\n");
                        sprintf(mail,"user XXXXXX\r\n");
                        write( (int)socket, mail, strlen(mail) );
                        fsync( (int)socket);
                        state = user;
                    }
                    else
                    {
                        printf("DEN ER IKKE OK\n");
                        close( (int)socket );
                    }
                    break;
                case user:
                    if (popSvar(buffer) == 1)
                    {
                        //printf("DEN ER OK\n");
                        sprintf(mail,"pass XXXXXX\r\n");
                        write( (int)socket, mail, strlen(mail) );
                        fsync( (int)socket);
                        state = pass;
                    }
                    else
                    {
                        printf("DEN ER IKKE OK\n");
                        close( (int)socket );
                    }
                    break;
                default:
                    result = 0;
            }
        }
    }
Avatar billede arne_v Ekspert
14. maj 2003 - 21:17 #42
Hm.

Umiddelbart er der ikke noget der falder i øjnene på mig.
Avatar billede jakobdo Ekspert
14. maj 2003 - 21:33 #43
Hmm, har lige set et sted, at en anden kodet det sådan her:
sprintf(mail,"pass XXXXXX");
write( (int)socket, mail, strlen(mail) );
write( (int)socket, "\n", 1 );

Burde det have en effekt?

Sidder desværre på windows nu, så må lige teste senere...
Avatar billede arne_v Ekspert
14. maj 2003 - 21:38 #44
Det burde være ligegyldigt.

Hvorfor kan du ikke teste din kode på Windows ?
Avatar billede jakobdo Ekspert
14. maj 2003 - 22:16 #45
Hvis jeg prøver at compilere med Borland C++, så kan den ikke finde alle mine headers...

Jeg får følgende fejl:

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
pop3.cpp:
Error E2209 pop3.cpp 8: Unable to open include file 'unistd.h'
Error E2209 pop3.cpp 10: Unable to open include file 'netdb.h'
Error E2209 pop3.cpp 11: Unable to open include file 'sys/socket.h'
Error E2209 pop3.cpp 12: Unable to open include file 'netinet/in.h'
Error E2184 pop3.cpp 18: Enum syntax error
Error E2040 pop3.cpp 18: Declaration terminated incorrectly
Error E2190 pop3.cpp 18: Unexpected }
Error E2190 pop3.cpp 18: Unexpected }
Error E2450 pop3.cpp 24: Undefined structure 'sockaddr_in' in function main(int,
char * *)
Error E2449 pop3.cpp 24: Size of 's_a' is unknown or zero in function main(int,c
har * *)
Error E2450 pop3.cpp 24: Undefined structure 'sockaddr_in' in function main(int,
char * *)
Error E2268 pop3.cpp 36: Call to undefined function 'socket' in function main(in
t,char * *)
Error E2451 pop3.cpp 36: Undefined symbol 'AF_INET' in function main(int,char *
*)
Error E2451 pop3.cpp 36: Undefined symbol 'SOCK_STREAM' in function main(int,cha
r * *)
Error E2268 pop3.cpp 41: Call to undefined function 'gethostbyname' in function
main(int,char * *)
Error E2034 pop3.cpp 41: Cannot convert 'int' to 'hostent *' in function main(in
t,char * *)
Warning W8060 pop3.cpp 41: Possibly incorrect assignment in function main(int,ch
ar * *)
Error E2315 pop3.cpp 47: 'sin_addr' is not a member of 'sockaddr_in', because th
e type is not yet defined in function main(int,char * *)
Error E2315 pop3.cpp 47: 'h_addr' is not a member of 'hostent', because the type
is not yet defined in function main(int,char * *)
Error E2315 pop3.cpp 48: 'sin_family' is not a member of 'sockaddr_in', because
the type is not yet defined in function main(int,char * *)
Error E2315 pop3.cpp 49: 'sin_port' is not a member of 'sockaddr_in', because th
e type is not yet defined in function main(int,char * *)
Error E2268 pop3.cpp 49: Call to undefined function 'htons' in function main(int
,char * *)
Error E2268 pop3.cpp 49: Call to undefined function 'atoi' in function main(int,
char * *)
Error E2268 pop3.cpp 50: Call to undefined function 'connect' in function main(i
nt,char * *)
Error E2450 pop3.cpp 50: Undefined structure 'sockaddr_in' in function main(int,
char * *)
Error E2109 pop3.cpp 50: Not an allowed type in function main(int,char * *)
Error E2228 pop3.cpp 50: Too many error or warning messages in function main(int
,char * *)
*** 26 errors in Compile ***
Avatar billede arne_v Ekspert
14. maj 2003 - 22:18 #46
BCC er en rigtig PC compiler.

Du skal have fat i en GCC.

GCC/Cygwin er 99% Unix source code kompatibel !
Avatar billede jakobdo Ekspert
15. maj 2003 - 11:30 #47
Kan jeg bruge en GCC compiler under windows, og kører filen der?
Eller skal jeg så installere cygwin først??

Jeg har prøvet at sniffe lidt, ang. mit pop3 problem...
Kan det passe de mærkelig tegn skyldes, at en pop3 server svare "+OK HELLO. (HEX værdi 0d og HEX 0a)
Når jeg så læser dette ind i en buffer, og skriver det ud, kommer der nogle mærkelige tegn...

Kan dette fikses på en måde?
Skal jeg evt parse bufferen, og læse indtil 0d og 0d, og lægge resultatet over i en buffer (altså uden 0d) og skrive dette ud??
Avatar billede arne_v Ekspert
15. maj 2003 - 11:51 #48
altså:

0x0d = \r
0x0a = \n
Avatar billede arne_v Ekspert
15. maj 2003 - 11:52 #49
Og de burde ikke give anledning til problemer.
Avatar billede arne_v Ekspert
15. maj 2003 - 11:55 #50
Cygwin er mange ting, men hvis du downloader GCC delen af cygwin,
så bør du kunne compile og køre din Linux applikation på Windows.

Bemærk dog at hvis du vil distribuere din EXE til en Windows
maskine uden Cygwin skal der kopieres nogle DLL filer med.

Men standard GCC med standard Unix header filer og libs.

Du kan også hente bash, grep, tar, gzip og alle de andre utilities
du bruger på Linux og køre dem på Windows.
Avatar billede jakobdo Ekspert
15. maj 2003 - 12:56 #51
Damn, min mail er busted....
Mon ikke jeg lige kunne få en admin til at ændre mit indlæg... :o)
Avatar billede arne_v Ekspert
15. maj 2003 - 13:22 #52
Prøv.
Avatar billede arne_v Ekspert
15. maj 2003 - 13:26 #53
Jeg forstå ikke helt din processing. jeg vill tro at det skulle
være:

            case list:
                    printf(buffer);
                    if (antal chars læst < totale antal chars) == 0)
                    {
                        /* bare fortsæt med at læse */
                        state = list;
                    }
                    else
                    {
                        send(theSocket, "quit\n", 5, 0);
                        state = quit;
                    }
                    break;
Avatar billede snowball Novice
19. maj 2003 - 09:11 #54
jakobdo: Har fjernet din kommentar fra 15/05-2003 12:55:32 hvori din email og dit password stod. Hvis der var andre ting i det indlæg som der skal bruges i dette spørgsmål, så skriv venligst de ting igen.

Snowball / CoAdmin
Avatar billede jakobdo Ekspert
20. maj 2003 - 08:57 #55
Tak, det var fandeme hurtig ekspedition! :o)
Men hellere sent end aldrig!
Takker...

(mega bøf jeg fik lavet det) :o)
Avatar billede snowball Novice
20. maj 2003 - 09:01 #56
jakobdo: Kunne ikke gøres ret meget hurtigere, for den mail du har sendt til Admin, skal først godkendes af ham inden vi får den tilsendt, og dermed kan gøre noget ved sagen, og det er han ikke altid lige hurtig til ;o)

Snowball
Avatar billede eagleeye Praktikant
20. maj 2003 - 16:55 #57
Til en anden gang så anmeld dig selv og skriv det som du har skrevet i mailen i anmeldsen. Så kan vi behande sagen med det samme.

Hilsen eagleeye
Avatar billede jakobdo Ekspert
20. maj 2003 - 19:45 #58
Det skal jeg huske!
(og selvfølgelig skal jeg bare være glad for det blev fikset, i var jo ikke skyld i min bommert)

Men jeg huske det med at anmelde mig selv...
Kunne det ikke være en ide, at man kunne redigere sine indlæg??
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