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 signedness

    Was 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. 😉


Anmelden zum Antworten