Bekomme warning einfach nicht weg
-
Hallo zusammen,
ich bin gerade dabei einen TCP-Server zu schreiben. Alles nicht dramatisches, es funktioniert, nur ich bekomme beim compilieren immer eine Warning.Also das ganze habe ich folgendermaßen aufgebaut:
struct sockaddr_in server_address, client_address; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = INADDR_ANY; server_address.sin_port = htons (15000); client_len = sizeof (struct sockaddr_in); server_len = sizeof (struct sockaddr_in); if ((server_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror ("Fehler beim Aufbau des Socket!\n"); exit(1); } if (bind ( server_socket, (struct sockaddr *) &server_address, server_len) != 0) { printf( "Der Port ist belegt!\n"); } if (listen (server_socket, anzahl_con) == -1) { perror("Fehler beim Aufruf von listen\n"); exit(1); }
Und jetzt kommt es, der Aufruf Accept:
while(1) { memset (netstring, 0, NETLEN); if ( (client_socket = accept ( server_socket, (struct sockaddr_in *) &client_address, &client_len )) == -1 ) { perror ("Fehler bei der Annahme der Clientverbindung\n"); }
und hier meckert der Compiler
pumuckl.c:113: warning: passing argument 2 of 'accept' from incompatible pointer type
pumuckl.c:113: warning: pointer targets in passing argument 3 of 'accept' differ in signednessWas ist blos die Ursache für diese Meldung? Egal ob ich sizeof (struct sockaddr_in) oder sizeof (struct sockaddr) verwende ich bekomme immer wieder diese Fehlermeldung.
Vielen Dank
Gruss Christian
-
Der Cast sieht komisch aus, wofür brauchst Du den? (
(struct sockaddr *) &server_address
)
Und vmtl. verwendest Du nicht size_t für die Größe sondern irgendein int oä. Ändere den Typ von client_len und server_len mal auf size_t (<stdlib.h> includen nicht vergessen)!
-
Jep, das wars
size_t client_len = 0; size_t server_len = 0;
und
if ( (client_socket = accept ( server_socket, (struct sockaddr *) &client_address, &client_len )) == -1 )
damit läufts, vielen Dank.
Ich dachte das hätte ich irgendwo mal mit int gesehen, aber das war wahrscheinlich ein veraltetes Beispiel.
Gruss Christian
-
size_t client_len = 0; size_t server_len = 0;
Das is afaik ne ganz schlechte Idee.
Sollte in
client_len = sizeof(struct sockaddr_in);
geändert werden. Analog bei server_len.
Der Grund ist der, dassin dieser Variable die Größe der übergebenen sockaddr Struktur stehen sollte.
Siehe dazu:
http://www.opengroup.org/onlinepubs/009695399/functions/accept.html
-
Siehe oben, das hat er doch ohnehin richtig. Offensichtlich initialisiert er das nur vorher mit 0 (aus welchem Grund auch immer).
-
Hmm ich hatte nur die 0-Zuweisung im letzten Post gesehen, und die macht keinen Sinn. Wenn er das weglässt und die erste Anweisung des ersten Posts nimmt, dann will ich nichts gesagt haben.