sockets probs mit accept()
-
hi,
casten beideutet daten eines bestimmten datentyps in einen anderen datentyp umzuwandeln. beispiel:
double d = 4.3; int i = (int)d;
i ist danach einfach 4 - da integer ja keine kommazahlen verwenden kann. in klammern steht immer der datentyp inden gecastet werden soll - in dem fall in double nach integer. wobei du nicht jeden datentyp in jeden andreren ohne probleme casten kannst.
in deinem fall müsste es glaube ich so aussehen:
c = accept(s, &cli, (sockaddr*) &cli_size);
mfg blan
-
Nicht wirklich
server2.cpp:47: Fehler: »sockaddr_in*« kann nicht nach »sockaddr*« für Argument »2« nach »int accept(int, sockaddr*, socklen_t*)« umgewandelt werden
Kann mir wer helfen?
Danke!
-
Der Cast ist ja auch an der falschen Stelle!
-
rüdiger schrieb:
Der Cast ist ja auch an der falschen Stelle!
Nein ist er nicht, ich habe mein Programm nur etwas erweitert und deshalb zeigt er auch Zeile 47 an!
-
Schau dir doch mal die Parameter von man: accept(2) an und dann entscheide welchen Parameter zu casten musst. Es ist sicher nicht der letzte.
Ein Blick in ein C Tutorial wäre sicher gut für dich.
-
Ich finds nicht raus... könntest du mir pls den code erklären, bzw. was ich jetzt wie mahcen muss und mir eventuell auch ein C++ tutorial / C tutorial empfehlen?
Danke
-
Ich hab ja gemerkt, dsas ich das 2te Argument casten muss
Versucht hab ichs dann so:c = accept(s, (sockaddr*) &cli, &cli_size);
Was mir eben nur einen Fehler mehr gab...
-
Hier mal den ganzen Code, meiner Meinung nach habe ich richtig gecastet, aber ich bekomme dennoch Fehler!
#include <iostream.h> #include <stdlib.h> #include <sys/select.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int s, c, cli_size; struct sockaddr_in srv, cli_addr; if (argc != 2) { fprintf(stderr, "usage: %s port\n", argv[0]); 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_addr); c = accept(s, (struct sockaddr *) &cli_addr, &cli_size); if (c == -1) { perror("accept() failed"); return 5; } } }
server2.cpp: In function »int main(int, char**)«:
server2.cpp:48: Fehler: ungültige Umwandlung von »int*« in »socklen_t*«
server2.cpp:48: Fehler: Argument 3 von »int accept(int, sockaddr*, socklen_t*)« wird initialisiert
-
Ei der daus. Jetzt meckert er ja über Argument 3. Vielleicht solltest du dir angucken welchen Typ er da erwartet (und nein es ist kein int!)
-
Könntest du mir nicht einfach die Lösung posten, denn ich habe ein ähnliches Script, welches die accept Funktion GENAU GLEICH hat und mit gcc prima funktioniert!
-
ähmverwirrt schrieb:
Könntest du mir nicht einfach die Lösung posten, denn ich habe ein ähnliches Script, welches die accept Funktion GENAU GLEICH hat und mit gcc prima funktioniert!
das bezweifel ich - deine variable cli_size ist einfach vom falschen typ, was man aber auch sehr schön an der fehlermeldung erkennt. schau einfach mal in die API was für ein variablentyp erwartet wird.
mfg blan
-
okay hat geklappt.
wie sieht es eigentlich mit dem bind aus da bekomm i9ch auch den fehler:server2.cpp:35: Fehler: »sockaddr_in*« kann nicht nach »const sockaddr*« für Argument »2« nach »int bind(int, const sockaddr*, socklen_t)« umgewandelt werden
Und das manual sagt mir auch nicht wirklich viel..
bind(int s, const struct sockaddr *name, socklen_t namelen);
ähm ja... :S
-
dabei handelt es sich wieder um ein cast-problem - ein blick in die API und das vergleichen der datentypen sollte es dir klarmachen.
mfg blan