2012-06-09 3 views
0

Ок - так что я пытаюсь получить приветственный сокет для IPv6 с C++. Проблема в том, что порт, который он прослушивает, кажется, меняется каждый раз, когда я запускаю программу.Проблемы с портами 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; 
} 

компилировать код с помощью г ++ server.cpp -o сервер, и когда я бегу ./server я получаю следующий результат:

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

Для проверки кода я бегу птар:

$ 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 

Я думаю, что я пропускаю что-то простое.

ответ

3

Да, я думаю, вы тоже. Прежде чем вы сможете использовать сокет для чего-либо, вам нужно сделать еще несколько вызовов. Если вы хотите быть сервером, вы должны позвонить bind(), чтобы установить локальный адрес, и listen(), чтобы сообщить ОС, что это сервер. Затем вы можете использовать accept. Иногда это немного больно.

  • bind(2) man page
  • listen(2) man page
  • Большой guide из Beej.us на Linux/Unix/Winsock программирования. Это дает отличные примеры и поставляется в полностью классифицированном формате PDF.
+0

Черт ... Я забыл привязки o.O‽ м ( - Я проверю, что и я думаю, что могу чем принять ваш ответ Спасибо за помощь мне :) –

+1

@JakobRunge: Конечно.. Просто запомните «listen()». – Linuxios

+0

... как во второй строке в блоке while? .) –

Смежные вопросы