Socket POP3 Anmeldung schlägt fehl C++ 

Status
Für weitere Antworten geschlossen.

Ultratermi

Registered +
Registriert
März 2009
Beiträge
63
Hey, ich arbeite an einem Mail downloader allerdings will der nicht ganz :depp:

Mail anbieter: gmx.net

kommt immer "Wrong Id/Pw" :(

Was mache ich falsch?

Code:
#include "stdafx.h" // includes are there ;)

//Prototypen

int startWinsock(void);

int main()
{

char buf[256];
long rc;
SOCKET s;
SOCKADDR_IN addr;


rc=startWinsock();


if(rc!=0)
{

printf("Fehler: startWinsock, fehler code: %d\n",rc); // failed


}

else

{

printf("Winsock gestartet!\n");

}

s=socket(AF_INET,SOCK_STREAM,0);

if(s==INVALID_SOCKET)

{

printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); // Failed

return 1;

}

else

{

printf("Socket erstellt!\n");

}

memset(&addr,0,sizeof(SOCKADDR_IN));

addr.sin_family=AF_INET;
addr.sin_port=htons(110);
addr.sin_addr.s_addr=inet_addr("213.165.64.22"); // pop.gmx.net


rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

if(rc==SOCKET_ERROR)

{

printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); // failed

}

else

{

printf("Verbunden mit gmx..\n");

}

recv(s,buf,sizeof(buf),0);
std::cout 

strcpy(buf, "user xxx@gmx.de");
send(s,buf,sizeof(buf),0);
//std::cout  
recv(s,buf,sizeof(buf),0);
std::cout 
strcpy(buf, "pass xxx");
send(s,buf,sizeof(buf),0);
//std::cout  

recv(s,buf,sizeof(buf),0);
std::cout 

closesocket(s);

WSACleanup();

system("pause");

return 0;
}

int startWinsock(void)

{

WSADATA wsa;

return WSAStartup(MAKEWORD(2,0),&wsa);

}

Hier ein screenshot von der ausgabe:

http://i29.tinypic.com/2cmpwcp.jpg


Danke schonmal!
 
Zuletzt bearbeitet von einem Moderator:
Schon mal versucht die Anmeldung über Telnet durchzuführen?

Ach ja, Du hättest auch die Header mit dazulegen können.
Hätte mir so spät am Abend das Nachdenken erspart :).
Dann kompiliert Dein Beispiel auch ...

Code:
#include "stdafx.h" // includes are there ;)
#include  // For perror() call
#include  // For exit() call
#include 

#include  // Include Winsock Library
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

Dein Problem dürfte übrigens in dem sizeof(buf) liegen.
Ich wette der liefert 256 zurück.

Und zwar aus folgendem Grund:
"When you apply the sizeof operator to an array identifier, the result is the size of the entire array rather than the size of the pointer represented by the array identifier."
Zitat aus der MSDN.
 
Zuletzt bearbeitet von einem Moderator:
So funktioniert es jetzt.
Aber es ist noch ganz dünnes Eis ...

Code:
// pop3.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h" // includes are there ;)
#include  // For perror() call
#include  // For exit() call
#include 

#include  // Include Winsock Library
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

//Prototypen

int startWinsock(void);

int main()
{

char buf[256];
int bytesRead, nRec;
std::string content;
long rc;
SOCKET s;
SOCKADDR_IN addr;


rc=startWinsock();


if(rc!=0)
{

printf("Fehler: startWinsock, fehler code: %d\n",rc); // failed


}

else

{

printf("Winsock gestartet!\n");

}

s=socket(AF_INET,SOCK_STREAM,0);

if(s==INVALID_SOCKET)

{

printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); // Failed

return 1;

}

else

{

printf("Socket erstellt!\n");

}

memset(&addr,0,sizeof(SOCKADDR_IN));

addr.sin_family=AF_INET;
addr.sin_port=htons(110);
addr.sin_addr.s_addr=inet_addr("213.165.64.22"); // pop.gmx.net


rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

if(rc==SOCKET_ERROR)

{

printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); // failed

}

else

{

printf("Verbunden mit gmx..\n");

}

bytesRead = 0;

nRec = recv(s, buf, sizeof(buf),0);
buf[nRec] = '\0';
content+=buf;
std::cout 
std::string user = "user meinemail@gmx.de";
user +=('\n');
send(s,user.c_str() ,user.length() ,0);

nRec = recv(s, buf, sizeof(buf),0);
buf[nRec] = '\0';
content+=buf;
std::cout 
std::string pass = "pass meinpasswort";
pass +=('\n');
send(s,pass.c_str(),pass.length(),0);

nRec = recv(s, buf, sizeof(buf),0);
buf[nRec] = '\0';
content+=buf;
std::cout 

closesocket(s);

WSACleanup();

system("pause");

return 0;
}

int startWinsock(void)

{

WSADATA wsa;

return WSAStartup(MAKEWORD(2,0),&wsa);

}


Was habe ich getan?
1. Ich habe std::string verwenden. Halte ich persönlich für besser als ein Bytearray.
2. Habe bei den empfangenen Daten eine null-Terminierung eingebaut.
3. Habe bei den ausgehenden Daten noch ein '\n' = CR eingebaut. Das tut man im Telnet ja auch.
(Auf Return drücken)
4. Habe der Funktion 'send' die korrekte Länge übergeben

Wo liegen noch Probleme:
1. Das Programm rauscht einfach durch. Aber was ist, wenn GMX erst "+OK GMX POP3"
und eine Minute später "StreamProxy ready" schickt. Das würde etwas Verwirrung stiften.


(noch 8 Tage und der Rest von heute)
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten