Avatar billede phrame Nybegynder
20. marts 2003 - 23:47 Der er 10 kommentarer og
1 løsning

socket til SMTP server

Heisan...

Hvordan opretter jeg en socket forbindelse til en SMTP server. Jeg har siddet og leget lidt med noget client-kode jeg har til sockets. Men når jeg prøver at lave forbindelsen på port 25 får jeg ikke reply fra mail-serveren. Men når jeg bruger PuTTY og vælger forbindelsestypen RAW kan jeg sagtens få det reply jeg har brug for. Er det fordi jeg ikke kan lave en almindelig socket til smtp-server, fordi denne skal modtage pakker i RAW format?
Avatar billede phrame Nybegynder
20. marts 2003 - 23:49 #1
Forresten så bruger jeg linux
Avatar billede arne_v Ekspert
20. marts 2003 - 23:53 #2
Nej. SMTP port 25 er helt normal TCP/IP og kan
accesses helt normalt via socket kald. Og også på Linux.
Avatar billede arne_v Ekspert
20. marts 2003 - 23:55 #3
Protokollen er beskrevet i RFC 821 og 822.
Avatar billede phrame Nybegynder
21. marts 2003 - 00:09 #4
problemet er stadig at når jeg bruger understående kode, får jeg ikke noget reply fra smtp serveren.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <iostream>

#define PORT 25

int main(int argc, char *argv[])
{
    int sockfd;
        struct hostent *he;
        struct sockaddr_in their_addr; // connector's address information

        if (argc != 2)
    {
            fprintf(stderr,"usage: client hostname\n");
            exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL)
    {  // get the host info
            perror("gethostbyname");
            exit(1);
        }

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
            perror("socket");
            exit(1);
        }

        their_addr.sin_family = AF_INET;    // host byte order
        their_addr.sin_port = htons(PORT);  // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

        if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
    {
            perror("connect");
            exit(1);
        }

    int    size = 1000,
        recvLen = 0,
        done = 0,
        numBytes,
        i;

    char *buf = (char *)malloc( size );

    while( !done && ( (numBytes = recv( sockfd, buf+recvLen, size-recvLen, 0)) >= 0) )
    {
        loop++;

        recvLen += numBytes;

        for( i=(recvLen-numBytes); i<recvLen; i++ )
            if( buf[ i ] == '\0' )
                done = 1;

        if( (size-recvLen)<100 )
        {
            size += 1000;
            buf = (char*)realloc( buf, size );
        }
    }
    cout <<"Følgende er blevet modtaget: " <<buf <<endl;

        close(sockfd);

        return 0;
}
Avatar billede phrame Nybegynder
21. marts 2003 - 00:12 #5
recv er også bygget op på den måde at den bliver ved med at modtage indtil den møder en nulterminering. Men når jeg laver et test med:

        loop = 0;
    char *buf = (char *)malloc( size );

    while( !done && ( (numBytes = recv( sockfd, buf+recvLen, size-recvLen, 0)) >= 0) )
    {    cout <<"LOOP " <<loop <<endl;
        loop++;


kan jeg se at den bare står og venter på at recv på socket'ten. Mit while løkker står bare og venter....
Avatar billede tam Nybegynder
21. marts 2003 - 00:26 #6
Du skal sende nogle data der ender med et CRLF pair...

F.eks. "HELO aa.bb\r\n"
Så svarer den tilbage. Een linie, der ender med CRLF, og så skal du sende igen ;)
Avatar billede tam Nybegynder
21. marts 2003 - 00:27 #7
Arne: Du er lidt "forældet" ;)
SMTP er RFC 2821
Avatar billede tam Nybegynder
21. marts 2003 - 00:29 #8
Du kan altid teste inden du koder. Telnet til din mailserver på port 25 og skriv: HELO aa.bb(Enter)

Så får du svar tilbage.
Det er præcis det samme som når du sender teksten fra dit program...
Avatar billede tam Nybegynder
21. marts 2003 - 00:31 #9
phrame> recv er også bygget op på den måde at den bliver ved med at modtage indtil den møder en nulterminering.

Den skal vente på CRLF, ikke på en nulterminering.
Avatar billede phrame Nybegynder
21. marts 2003 - 01:00 #10
hmmmm... det lod til bare at være min terminering som var gået galt.... tak for hjælpen
Avatar billede phrame Nybegynder
21. marts 2003 - 01:02 #11
tak for hjælpen, tam...
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