Verbindung via IPv6 herstellen



  • tach zusammen,

    ich hätte da mal ein mittelschweres verständnisproblem zu einer sache die mir mein chef in der praxisphase von meinem studium aufgetragen hat. ich soll durch ein c++ programm (konsolenanwendung reicht) eine verbindung mit einem server, einer internetseite oder was auch immer herstellen und das ganze soll IPv6 kompatibel sein.
    jetzt ist mein chef nicht da und ich weiß nicht so richrig wo ich anfangen soll. bin auch c++ technisch noch relativ am anfang ... 😕
    er hat mir anfang noch einen codeausschnitt mit der übertragung via IPv4 geschickt.

    SOCKET ViaConnectConnect(char *host,int port) {
                    SOCKET so=INVALID_SOCKET;
    
                    SOCKADDR_IN sad;
                    struct hostent *he;
                    union u_ipadr {
                                   unsigned long l;
                                   unsigned char c[4];
                    };
                    union u_ipadr ipadr;
    
                    // ggf. Server-Name nach IP-Adresse auflösen
                    if(host[0]>'9') { // nur wenn Name nicht schon eine IP-Adresse ist
    
                                   if(!(he=gethostbyname(host))) {
                                                   return(INVALID_SOCKET);
                                   }      
                                   if(!he->h_addr_list[0]) { 
                                                   return(INVALID_SOCKET);
                                   }
    
                                   ipadr.c[0]=he->h_addr_list[0][0];
                                   ipadr.c[1]=he->h_addr_list[0][1];
                                   ipadr.c[2]=he->h_addr_list[0][2];
                                   ipadr.c[3]=he->h_addr_list[0][3];
                    }
    
                    so=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); // Socket oeffnen
                    if(so==INVALID_SOCKET) {
                                   return(INVALID_SOCKET);
                    } else {                                                                                                // Socket erfolgreich geoeffnet               
                                   //connect to ip address and port
                                   sad.sin_family=AF_INET;
                                   if(host[0]>'9') sad.sin_addr.s_addr=ipadr.l;
                                   else sad.sin_addr.s_addr=inet_addr(host);
                                   sad.sin_port=htons(port); // Port 
                                   if(connect(so,(LPSOCKADDR)&sad,sizeof(sad))) {
                                                   closesocket(so);
                                                   return(INVALID_SOCKET);
                                   }
                    }
                    return(so);
    }
    

    jetzt würde ich gerne wissen, wie ich das problem am besten angehe. vielleicht hat schon jemand was ähnliches gemacht und kann mir helfen die sache zu verstehen.

    danke schonmal im voraus

    gruß bautzi 😉



  • Ok und was ist jetzt dein Problem? 🙂



  • naja ich weiß halt net so genau wie ich an das problem rangehen soll und was dann bei IPv6 anders sein soll. ich brauch net unbedingt eine fertige lösung, mir gehts mehr ums verständnis, dass ich weiß womit ich beschäftigen muss um die sache hinzubekommen...





  • danke! das hilft mir erstmal etwas weiter. 🙂



  • int sock;
    struct sockaddr_in6 name;

    /* Create the socket. */
    sock = socket (AF_INET6,SOCK_STREAM,0);
    if (sock < 0)
    throw socket_error("Error when creating a socket.");

    /* Set REUSE option (this makes rebinding after a server shutdown
    * quicker). */
    int reuse = 1;
    if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
    throw socket_error("Error when setting socket options.");

    /* Give the socket a name. */
    name.sin6_family = AF_INET6;
    name.sin6_port = htons(port);
    name.sin6_addr = in6addr_any;
    if (bind(sock,(struct sockaddr 😉 &name,sizeof (name)) < 0)
    throw socket_error("Error when binding the server socket to its port.");

    return sock;

    Auch
    man 7 ipv6
    unter Linux kann sehr hilfreich sein.



  • besten dank dafür.
    ich werd mal sehen wie ich das dann einbauen kann. muss mich erstmal noch intensiver mit dem thema beschäftigen...


Log in to reply