TCP/IP



  • Nachdem man mich hier hin verwiesen hat, versuch ich hier mal mein Glück:

    Hi Comunity!
    Ich möchte gerne einen Server im Internet connecten. z. B. smtp.web.de Port: 25

    Wenn ich allerdings den Host smtp.web.de mit der Funktion gethostbyname zu entschlüsseln versucht funzt das anscheinen nicht. Ich hab mal meinen Quelltext mitgebracht:

    #include<iostream>
    #include<windows.h>
    #include<winsock2.h>
    #include<string.h>
    #include<conio.h>
    
    #pragma argsused
    
    #define BUFFER_SIZE 1024
    
    char* ctIP = new char[50]; // connect to IP
    u_short port;
    SOCKET s;
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    int startWinsock(void);
    bool connecting(void);
    bool prnt_incomming(void);
    bool sending_string(char* text);
    
    int main(int argc, char **argv)
    {
        char msg[100];
    
        cout << "IP:   " << flush;
        cin >> ctIP;
        cout << "Port: " << flush;
        cin >> port;
    
        if(connecting())
        {
    
            do
            {
                cout << "Waiting for answer..." << endl;
    
                if(!prnt_incomming())
                    cerr << "Error: Nothing incomming!" << endl;
    
                cout << "Your massage (#exit# for closing connection):" << endl;
                cin >> msg;
                if(strcmp(msg, "#exit#") != 0)
                    if(!sending_string(msg))
                        cerr << "Error: Sending failed!" << endl;
            } while(strcmp(msg, "#exit#") != 0);        
        }
    
        closesocket(s);
        WSACleanup();
    
        cout << "\nPress any key to exit..." << flush;
        getch();
    
        return 0;
    }
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    
    {
    
      long rc;
    
      unsigned long ip;
    
      HOSTENT* he;
      /* Parameter prüfen */
    
      if(hostnameOrIp==NULL || addr==NULL)
      cerr << "Error: Parameter error!" << endl;
    
        return SOCKET_ERROR;
      /* eine IP in hostnameOrIp ? */
    
      ip=inet_addr(hostnameOrIp);
      /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
    
      if(ip!=INADDR_NONE)
      {
        addr->sin_addr.s_addr=ip;
        return 0;
      }
      else
      {
        /* Hostname in hostnameOrIp auflösen */
        he=gethostbyname(hostnameOrIp);
    
        if(he==NULL)
        {
          return SOCKET_ERROR;
        }
        else
        {
          /*die 4 Bytes der IP von he nach addr kopieren */
          memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
        }
        return 0;
      }
    }
    
    int startWinsock(void)
    {
        WSADATA wsa;
        return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    bool connecting(void)
    {
        long rc;
        SOCKADDR_IN addr;
    
        // === STARTING WINSOCK ===
        rc = startWinsock();
        if(rc!=0)
        {
            cerr << "Error: Starting winsock #" << rc << endl;
            return false;
        }
        else
        {
            cout << "Winsock was started!" << endl;
        }
    
        // === CREATING SOCKET ===
        s = socket(AF_INET, SOCK_STREAM, 0);
        if(s == INVALID_SOCKET)
        {
            cerr << "Error: Creating socket #" << WSAGetLastError() << endl;
            return false;
        }
        else
        {
            cout << "Socket was created!" << endl;
        }
    
        // === CONNECTING ===
        memset(&addr, 0, sizeof(SOCKADDR_IN)); // set all 0 
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        //addr.sin_addr.s_addr = inet_addr(ctIP);
    
        rc=getAddrFromString(ctIP, &addr);
        if(rc==SOCKET_ERROR)
        {
            cout << "IP für " << ctIP << " konnte nicht aufgeloest werden" << endl;
            return false;
        }
        else
        {
            cout << "IP aufgeloest!" << endl;
        }
    
        rc = connect(s, (SOCKADDR*) &addr, sizeof(SOCKADDR));
        if(rc == SOCKET_ERROR)
        {
            cerr << "Error: Connecting #" << WSAGetLastError() << endl;
            return false;
        }
        else
        {
            cout << "Connected to " << ctIP  << "!" << endl;
        }
    
        return true;
    }
    
    bool prnt_incomming(void)
    {
        char buf[BUFFER_SIZE];
        int bytes;
    
        bytes = recv(s, buf, sizeof(buf) - 1, 0);
        if (bytes == -1)
            return false;
        buf[bytes] = '\0';
    
        cout << "_Incomming:_" << endl;
        cout << buf << endl;
    
        return true;
    }
    
    bool sending_string(char* text)
    {
        int bytes;
        bytes = send(s, text, strlen(text), 0);
        if(bytes == -1)
            return false;
        return true;
    }
    

    Wieso funzt das nun nicht?

    CU & Thx im Voraus!
    Konstantin



  • so stop. editier mal dein posting auf das relevante! und dann sag, was der fehler ist. funktioniert es nur bei web.de nicht, oder gibt er käse oder was?



  • ich würd das ganze so machen:

    addr.sin_addr = *(struct in_addr*) gethostbyname("smtp.web.de")->h_addr; // für hostnamen
    addr.sin_addr = inet_addr("192.168.100.1"); // für IP Adressen
    


  • Note The gethostbyname function has been deprecated by the introduction of the getaddrinfo function. Developers creating Windows Sockets 2 applications are urged to use the getaddrinfo function instead of gethostbyname.

    Quelle

    Man sollte also besser getaddrinfo benutzen. Wie man diese Funktion aufruft hatten wir erst vor ein paar Monaten geklärt. 🙂
    Mit der Suchen-Funktion dieses Forums sollte man den Thread finden.


Anmelden zum Antworten