socklen_t* Problem!
-
EIn Tag hier und schon 2mal nach hilfe Fragen. Naja kann nur besser werden. *g*
Hab im Inet ein schöne übersicht über Socket Programmierung gefunden und auch gleich mal damit rumgespielt. Hab jezt einen einfachen Server geschrieben (naja zumteil abgeschrieben).
Nur leider bricht er beim compilieren immer mit nem seltsamen Fehler ab der mir nichts sagt. Aber das heißt ja nix.Hier mal der Code:
int main(int argc, char *argv[]) { int s, c, cli_size; struct sockaddr_in srv, cli; if (argc != 2) { cout << "usage: " << argv[0] << " port/n"; return 1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket() failed"); return 2; } srv.sin_addr.s_addr = INADDR_ANY; srv.sin_port = htons( (unsigned short int) atol(argv[1])); srv.sin_family = AF_INET; if (bind(s, &srv, sizeof(srv)) == -1) { perror("bind() failed"); return 3; } if (listen(s , 3) == -1) { perror("listen() failed"); return 4; } for(;;) { cli_size = sizeof(cli); c = accept(s, &cli, &cli_size); if (c == -1) { perror("accept() failes"); return 5; } cout << "client from "; if (handling(c) == -1) cout << "Fehler"; close(c); } return 0; }
und hier der Fehler beim compilieren
server.cc: In function `int main(int, char**)': server.cc:58: error: cannot convert `sockaddr_in*' to `const sockaddr*' for argument `2' to `int bind(int, const sockaddr*, unsigned int)' server.cc:73: error: cannot convert `sockaddr_in*' to `sockaddr*' for argument `2' to `int accept(int, sockaddr*, socklen_t*)'
Google spuckt auch nichts brauchbares aus!
-
einfach type cast nach sockaddr*
-
ich dachte die wären kompatibel untereinander! Weil in allen Beispielen im Netz steht es genau so drin.
-
habs jetzt mal geändert.
if (bind(s, (struct sockaddr *)&srv, sizeof(srv)) == -1)
jetzt meckert der compiler aber wieder
server.cc: In function `int main(int, char**)': server.cc:74: error: invalid conversion from `int*' to `socklen_t*'
-
Hat keiner ne Idee was der Fehler sein könnte?
-
c = accept(s,(struct sockaddr *)&cli,&cli_size);
das ist die Zeie über die er meckert.
cli_size ist inthat sich bei accept was geändert.
hab nämlich keine ahnung wie alt das tut ist das ich habe!
-
ok hat sich erledigt.
das hier steht in der Version die ich habe und noch auf vilen Seiten im Netz.
int accept(int s, struct sockaddr *addr, int *addrlen);
Das scheint die richtige Variante zu sein.
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
Seit wann ist das geändert?
Wo kann man sich über solche änderungen auf dem laufenden halten?