POP3, Begrüßung wird Empfangen, und dann ?



  • Hallo, ich habe das Tutorial von c-worker benutzt. Den Code so angepasst dass er auf den pop3 Server von web.de verbindet. Die Verbindung wird hergestellt, die Begrüßung des Servers wird auch noch angezeigt, wenn ich aber dann USER xxx eingebe und enter drücke, dann bleibt das Programm stehen und die Verbindung wird nach einer weile abgebrochen. Was mache ich falsch ?

    int main()
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[4096];
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(110); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr("217.72.192.134"); // zielrechner ist unser eigener
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        getch();
        return 1;
      }
      else
      {
        printf("Verbunden\n");
      }
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        /*printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
        buf[strlen(buf)]='\0';
        send(s,buf,strlen(buf),0);*/
        rc=recv(s,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("\nServer antwortet: %s\n",buf);
        printf("\nZeichenfolge eingeben [max 4096]: ");
        gets(buf);
        buf[strlen(buf)]='\0';
        send(s,buf,strlen(buf),0);
      }
      closesocket(s);
      WSACleanup();
      getch();
      return 0;
    }
    


  • Hallo Problemkind,

    ein einfaches Return (von der Tastatur) reicht nicht!

    aendere Dein Code wie folgt:

    gets(buf); 
        strcat(buf, "\r\n");
        send(s,buf,strlen(buf),0);
    

    Damit sollte es gehen!

    Gruss Olli.



  • vielen dank, daa531.
    Es funktioniert jetzt einwandfrei, hätte nicht gedacht dass es an so einer Kleinigkeit liegt.



  • Ändere bitte auch noch gets() in fgets() um. Mit gets() riskierst du einen Bufferoverflow.



  • Hi,

    so als Tip, les dir die RFC zu POP durch:

    http://www.ietf.org/rfc/rfc1939.txt

    Gruß


Anmelden zum Antworten