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);
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...
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...
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)
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..??
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.
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)
/*****************************************************************************\ * * * 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...
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...
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 ***
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??
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;
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.
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)
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??
Synes godt om
Ny brugerNybegynder
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.