2016-08-21 2 views
2

Ich bin ziemlich neu in der Socket-Programmierung, und ich versuche, ein Programm zu schreiben, das eingehende TCP-Verbindungen erhalten und irgendwie verwalten würde. Ich kann nicht herausfinden, warum der folgende Code wird mir eine „Umfrage Fehler“ geben:Was verursacht Fehler in der Poll() - Funktion, C++?

int main(int argc, char *argv[]) { 
char *port; 
struct pollfd connections[MAX_CONNECTIONS]; 
struct addrinfo addr_hints, *addr_result; 
int ret, i; 

for (i = 0; i < MAX_CONNECTIONS; ++i) { 
    connections[i].fd = -1; 
    connections[i].events = POLLIN; 
    connections[i].revents = 0; 
} 

port = "0"; 

memset(&addr_hints, 0, sizeof(struct addrinfo)); 
addr_hints.ai_flags = AI_PASSIVE; 
addr_hints.ai_family = AF_UNSPEC; 
addr_hints.ai_socktype = SOCK_STREAM; 
addr_hints.ai_protocol = IPPROTO_TCP; 

getaddrinfo(NULL, port, &addr_hints, &addr_result); 

connections[0].fd = socket(addr_result->ai_family, addr_result->ai_socktype, addr_result->ai_protocol); 

if (connections[0].fd < 0) { 
    cerr << "Socket error" << endl; 
    return 0; 
} 

if (bind(connections[0].fd, addr_result->ai_addr, addr_result->ai_addrlen) < 0) { 
    cerr << "Bind errror" << endl; 
    return 0; 
} 

if (listen(connections[0].fd, 25) < 0) { 
     cerr << "Listen error" << endl; 
    return 0; 
} 

do { 
    for (i = 0; i < MAX_CONNECTIONS; ++i) 
      connections[i].revents = 0; 

    ret = poll(connections, MAX_CONNECTIONS, -1); 

    if (ret < 0) { 
     cerr << "Poll error" << endl; 
     return 0; 
    } else { 
     //DO SOMETHING 
    } 

} while(true); 
} 

MAX_CONNECTIONS ist eine Konstante Set 10000. Anschlüsse [0] soll der Descriptor sein, auf dem ich zu hören bin zu eingehende Verbindungen. Ich setze Port auf "0", weil ich einen zufälligen Port wählen möchte. Es scheint, dass die Polling-Funktion sofort fehlschlägt und die Nachricht "Poll error" (also Poll() war im Grunde weniger als 0). Ich habe überprüft und nach Poll-und Binde-Verbindungen [0] hat einen Datei-Deskriptor. Ich bin mir nicht sicher, was ich falsch mache, ist es etwas mit der getaddrinfo-Funktion?

+4

Wenn Sie einen Fehler von einem System zu erhalten rufen müssen Sie [ 'errno'] überprüfen (http://man7.org /linux/man-pages/man3/errno.3.html), um den Fehlercode zu erhalten. Sie können z.B. ['strerror'] (http://en.cppreference.com/w/cpp/string/byte/strerror), um eine druckbare Zeichenfolge des Fehlers zu erhalten. –

+0

Ich verstehe. Ich habe getan, was Sie empfohlen haben, und es stellt sich heraus, dass es sich um einen Fehler "ungültiges Argument" handelt. Gibt es eine Art Grenze für die Größe der Struktur? Ich weiß nicht, was sonst noch hier falsch sein könnte. – TheMountainThatCodes

Antwort

3

Das Problem ist, dass Ihr Dateideskriptor-Array für die Abfrage zu groß ist. Die maximale Größe ist definiert als RLIMIT_NOFILE. Dies ist wahrscheinlich 1024 für Ihr System. Reduziere MAXIMUM_CONNECTIONS auf diesen Wert oder weniger.

Aus der Umfrage spec:

EINVAL The nfds value exceeds the RLIMIT_NOFILE value. 

Mehr unter: http://man7.org/linux/man-pages/man2/poll.2.html

Verwandte Themen