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?
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. –
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