2012-06-09 2 views
0

Ok - j'essaie donc de faire fonctionner une socket de bienvenue pour IPv6 avec C++. Le problème est que le port sur lequel il écoute semble changer chaque fois que je démarre le programme.Problèmes de port IPv6 C++

#include <iostream> 
#include <stdlib.h> 
#include <string> 
#include <string.h> 
#include <arpa/inet.h> 

int main(int argc, char *argv[]){ 
    //Setting up the serverAddr: 
    struct sockaddr_in6 serverAddr; 
    memset((char *)&serverAddr, 0, sizeof(sockaddr_in6)); 
    serverAddr.sin6_family = AF_INET6;  // IP6 is best current practise. 
    serverAddr.sin6_addr = in6addr_any; // Don't care for interfaces. 
    serverAddr.sin6_port = htons(7979); // FIXME change port later. 
    //Opening the welcomeSocket: 
    std::cout << "Opening socket:\t"; 
    int welcomeSocket = socket(AF_INET6, SOCK_STREAM, 0); 
    if(welcomeSocket < 0){ 
    std::cout << "[FAIL]" << std::endl; 
    return 1; 
    }else{ 
    std::cout << "[ OK ]" << std::endl; 
    } 
    //Listening for clients: 
    while(welcomeSocket >= 0){ 
    std::cout << "Listening for connections…" << std::endl; 
    listen(welcomeSocket, 1); 
    struct sockaddr_in6 clientAddr; 
    memset((char *)&clientAddr, 0, sizeof(sockaddr_in6)); 
    int clientAddrLength = sizeof(clientAddr); 
    int clientSocket = accept(welcomeSocket, (struct sockaddr*) &clientAddr, (socklen_t*) &clientAddrLength); 
    char caddr[INET6_ADDRSTRLEN]; //caddr is not lisp here. 
    inet_ntop(AF_INET6, &clientAddr, caddr, INET6_ADDRSTRLEN); 
    std::cout << "Request from '" << caddr << "'" << std::endl; 
    shutdown(clientSocket, SHUT_RDWR); 
    clientSocket = -1; 
    shutdown(welcomeSocket, SHUT_RDWR); 
    welcomeSocket = -1; 
    } 
    return 0; 
} 

Je compilez le code via g ++ server.cpp -o serveur, et quand je lance ./server je reçois la sortie suivante:

$ ./server 
Opening socket: [ OK ] 
Listening for connections… 
Request from 'a00:c158::' 

Pour tester le code que je lance nmap:

$ nmap -6 -p 1-65535 ::1 

Starting Nmap 5.21 (http://nmap.org) at 2012-06-09 16:43 CEST 
Nmap scan report for ip6-localhost (::1) 
Host is up (0.00023s latency). 
Not shown: 65532 closed ports 
PORT  STATE SERVICE 
22/tcp open ssh 
631/tcp open ipp 
56160/tcp open unknown 

Nmap done: 1 IP address (1 host up) scanned in 1.41 seconds 

Je pense que je néglige quelque chose de simple.

Répondre

3

Oui, je pense que vous aussi. Avant de pouvoir utiliser une socket pour quelque chose, il y a quelques autres appels que vous devez faire. Si vous voulez être un serveur, vous devez appeler bind() pour définir l'adresse locale et listen() pour informer le système d'exploitation qu'il s'agit d'un serveur. Ensuite, vous pouvez utiliser accepter. C'est parfois un peu douloureux.

+0

Merde ... J'oublièrent la liaison o.O‽ m ( - Je vais vérifier et je pense que je peux accepter que votre réponse Merci de me aider :) –

+1

@JakobRunge: Bien sûr.. N'oubliez pas de 'écouter()' aussi. – Linuxios

+0

... comme dans la deuxième ligne du bloc while? .) –