ďťż

Ładny brzuch

Witam, mam program odbierający listę e-mail z serwera poczta.o2.pl. Jak wykonuje wszystkie operacje przez Telnet (USER, PASS, LIST) otrzymuje to co chce czyli listę e-maili (ok. 772). Ale jak zaczynam robić to programowo to program jakby zatrzymuje się po odebraniu +OK (zaraz po wysłaniu LIST) :/ Co jest nie tak?
#include <stdio.h> #include <winsock2.h> SOCKET mySocket; char* recvMsg = new char [1024]; int _connect(char*, unsigned short int); void sendMsgFunction(char*); void reportError(int, char*); void recvMsgFunction(); int main() { _connect("poczta.o2.pl", 110); recvMsgFunction(); sendMsgFunction("USER *********\r\n"); sendMsgFunction("PASS *********\r\n"); sendMsgFunction("LIST\r\n"); for(;;); return 0; } int _connect(char* address, unsigned short int port) { WSADATA wsaData; LPHOSTENT hostEntry; WSAStartup(MAKEWORD(2,0), &wsaData); mySocket = socket(AF_INET, SOCK_STREAM, 0); if(mySocket == INVALID_SOCKET) { reportError(WSAGetLastError(), "socket()"); WSACleanup(); return -1; } hostEntry = gethostbyname(address); if(!hostEntry) { reportError(WSAGetLastError(), "gethostbyname()"); WSACleanup(); return -1; } SOCKADDR_IN serverInfo; serverInfo.sin_family = AF_INET; serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); serverInfo.sin_port = htons(port); if(connect(mySocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)) == SOCKET_ERROR) { reportError(WSAGetLastError(), "connect()"); WSACleanup(); return -1; } } void sendMsgFunction(char* msg) { printf("%s", msg); if(send(mySocket, msg, strlen(msg), 0) == SOCKET_ERROR) reportError(WSAGetLastError(), "send()"); else recvMsgFunction(); } void reportError(int errorCode, char* function) { char* errorMsg = new char[128]; ZeroMemory(errorMsg, 128); printf("%s returned error %d!: %s", function, errorCode, errorMsg); delete [] errorMsg; } void recvMsgFunction() { if(recv(mySocket, recvMsg, 1024, 0) == SOCKET_ERROR) reportError(WSAGetLastError(), "recv()"); printf("%s", recvMsg); ZeroMemory(recvMsg, 1024); }W konsolce otrzymuje

+OK POP3 Ready poczta.o2.pl
USER **********
+OK Username set to : ********
PASS ********
+OK
LIST
+OK
A i mam jeszcze jeden problem, mianowicie nie mogę się w ogóle połączyć z gmail'em (addr:pop.gmail.com port:995) nawet przez Telnet.



co robi ta petla:
for(;;);

a w gmailu najpierw trzeba włączyć obsługę POP3 - przez stronę

Ta pętla ma zatrzymać program powiedzmy mój odpowiednik system("pause"); albo getch();. Ale i tak nie ma ona większego znaczenia przy tym problemie gdyż po wysłaniu LIST powinienem otrzymać liste e-mail a dopiero poźniej powinna się zacząć wykonywać ta pętla.

A POP3 jest włączony bo przez thunderbird'a odbieram wszystko normalnie.
Użytkownik patseb edytował ten post 17 maj 2006, 07:48
Jeśli masz jakieś wiadomości, funkcję recvMsgFunction() wywołaj dwa razy :)



Wywoływałem nawet kilkanaście razy =] Ale nic jedyne co otrzymałem po +OK to .

Zrobiłem coś takiego i udało mi się otrzymać dwie początkowe pozycje z LIST ale dalej nie wiem co mam zrobić zeby dostać ją całą. :/
#include <stdio.h> #include <winsock2.h> #include <process.h> SOCKET mySocket; char* recvMsg = new char [1024]; int _connect(char*, unsigned short int); void sendMsgFunction(char*); void reportError(int, char*); void recvMsgFunction(); void myThread(void *); int main() { _beginthread(myThread, 0, NULL); _connect("poczta.interia.pl", 110); sendMsgFunction("USER patseb\r\n"); sendMsgFunction("PASS 14688641\r\n"); sendMsgFunction("LIST\r\n"); for(;;); return 0; } int _connect(char* address, unsigned short int port) { WSADATA wsaData; LPHOSTENT hostEntry; WSAStartup(MAKEWORD(2,0), &wsaData); mySocket = socket(AF_INET, SOCK_STREAM, 0); if(mySocket == INVALID_SOCKET) { reportError(WSAGetLastError(), "socket()"); WSACleanup(); return -1; } hostEntry = gethostbyname(address); if(!hostEntry) { reportError(WSAGetLastError(), "gethostbyname()"); WSACleanup(); return -1; } SOCKADDR_IN serverInfo; serverInfo.sin_family = AF_INET; serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); serverInfo.sin_port = htons(port); if(connect(mySocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)) == SOCKET_ERROR) { reportError(WSAGetLastError(), "connect()"); WSACleanup(); return -1; } } void sendMsgFunction(char* msg) { printf("%s", msg); if(send(mySocket, msg, strlen(msg), 0) == SOCKET_ERROR) reportError(WSAGetLastError(), "send()"); } void reportError(int errorCode, char* function) { char* errorMsg = new char[128]; ZeroMemory(errorMsg, 128); printf("%s returned error %d!: %s", function, errorCode, errorMsg); delete [] errorMsg; } void recvMsgFunction() { if(recv(mySocket, recvMsg, 1024, 0) == SOCKET_ERROR) reportError(WSAGetLastError(), "recv()"); printf("%s", recvMsg); ZeroMemory(recvMsg, 1024); } void myThread(void *) { while(1) recvMsgFunction(); }

Od zera napisałem:#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <winsock2.h> int resolve(char* x) { HOSTENT* h; while(1){ h = gethostbyname(x); return *(int*)((int)h->h_addr_list+8); if (!strcmp(h->h_name,x)) break; } } int s; char* c; void sstr(char* m) { send(s,m,strlen(m),0); int r = recv(s,c,256,0); c[r]=0; printf("%s",c); } int main() { WSADATA wd; WSAStartup(1,&wd); s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_in ad; ad.sin_family = AF_INET; ad.sin_port = ntohs(110); ad.sin_addr.s_addr = resolve("pop3.o2.pl"); if (!connect(s,(SOCKADDR*) &ad,16)) { c = new char[256]; recv(s,c,256,0); printf("%s",c); sstr("USER **\r\n"); sstr("PASS **\r\n"); sstr("STAT\r\n"); if (c[0]!='0') { sstr("LIST\r\n"); while(1){ int r = recv(s,c,256,0); c[r]=0; printf("%s",c); if (r<256) break; }; } }else{ printf("Error connecta!\n"); } system("pause"); }
Użytkownik Cyrkiel edytował ten post 19 maj 2006, 19:50
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •