C Fehler/Warnung beim Kompilern eine c Datei unter Linux

rene87

Lieutenant
Registriert
Mai 2007
Beiträge
752
Moin an alle,

wie der Titel schon sagt habe ich beim Kompileren einer C datei einige Fehler Warnung
  1. passing argument 2 of ‘accept’ from incompatible pointer type
    /usr/include/sys/socket.h:214: note: expected ‘struct sockaddr * __restrict__’ but argument is of type ‘struct sockaddr_in *
  2. incompatible implicit declaration of built-in function ‘printf’
hier ist der Code
Code:
#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <time.h>

#include <string.h>

#define SERVER_PORT 2222

int main(char *argv[], int argc) {

	int sockfd, newsockfd, client_len, childpid,cli_size;

	struct sockaddr_in serv_addr, client_addr;

	time_t systime;

	char *chrtime;

	int timelen;

	printf("creating socket...");

	/**

	* Socket erstellen!

	*/

	  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  if (sockfd < 0) {

        perror("Socket konnte nicht erstellt werden. FEHLER!\n");

	}

  else printf("OK\n");

	/**

	* Socket erstellt!

	*/



	bzero(&serv_addr, sizeof(serv_addr));

	serv_addr.sin_family = AF_INET;

	serv_addr.sin_addr.s_addr = INADDR_ANY;

	serv_addr.sin_port = htons(52500);

	printf("binding socket...");

	/**

	* Socket binden!

	*/

	  if (bind(sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) {

       	printf("Socket konnte nicht gebunden werden. FEHLER!\n");

	}

  else printf("OK\n");

	/**

	* Socket gebunden!

	*/



	printf("putting socket into listen-mode...");

	/**

	* listen aufrufen!

	*/

  if(listen(sockfd, 3) == -1)

  {

  	perror("Kann auf dem Socket nicht lauschen. FEHLER!\n");

  }

  else printf("OK\n");

	/**

	* listen aufgerufen!

	*/

   

	printf("waiting for client connection...");

	/**

	* accept aufrufen!

	*/

	  int port;

	  port = accept(sockfd, &client_addr, &cli_size);



	/**

	* accept aufgerufen!

	*/



	printf("OK\n");

	printf("client address: %s \n", inet_ntoa(client_addr.sin_addr));

	time(&systime);

	chrtime = ctime(&systime);

	timelen = strlen(chrtime);

	printf("sending current system-time...");

	/**

	* Zeit ueber Socket verschicken!

	*/

  printf(chrtime);

  printf("...");
  int bytes;

  bytes = send(port, chrtime,timelen,0);

  if(bytes == -1)

  {

	perror("Konnte Nachricht nicht senden. FEHLER!");

  }

  else printf("OK\n");

  	/**

	* Zeit ueber Socket verschickt!

	*/

	close(port);

	close(client_addr.sin_addr);

  if(close(sockfd) == -1){

		printf("Fehler beim schließen");

		}



}
ich habe schon versucht aus sockaddr_in ein sockaddr zu machen doch dann kommt es immer zu "Socket konnte nicht gebunden werden"
da ich unter Linux nicht sehr fit bin wei ich auch nicht wie ich diesen Fehler beheben könnte
MfG René
 
caste mal richtig.
Code:
port = accept(sockfd, (sockaddr_in *)&client_addr, &cli_size);
 
1. passing argument 2 of ‘accept’ from incompatible pointer type
/usr/include/sys/socket.h:214: note: expected ‘struct sockaddr * __restrict__’ but argument is of type ‘struct sockaddr_in *

Bei accept() (wie auch bei recvfrom(), sendto(), ...) wird ein struct sockaddr* erwartet.

struct sockaddr sieht folgendermaßen aus:
Code:
struct sockaddr {
sa_family_t sa_family; // Adressfamilie
char sa_data[14]; // Adresse
}

Die 14 Byte-Nutzdaten dieser Struktur beschreiben eine allgemeine für die SocketKommunikation verwendbare Adresse.

Werden die Verbindungdaten mittels Angabe von IP und Port angegeben (was bei AF_INET als Adressfamilie immer der Fall ist), dann kann man den struct sockaddr_in verwenden, der folgendermaßen aussieht:

Code:
struct sockaddr_in {
sa_family_t sin_family; // AF_INET
unsigned short sin_port; // PORT-Nummer
struct in_addr sin_addr; // IP-Adresse
unsigned char pad[8]; // unbenutzt
}
struct in_addr { // IP Internet-Adresse im
in_addr_t s_addr; // speziellen Netzwerk-Format
}

Was also bei deinem accept()-Aufruf fehlt, ist der cast zu struct sockaddr*:
Code:
port = accept(sockfd, [COLOR="Red"](struct sockaddr*)[/COLOR] &client_addr, &cli_size);

Übrigens hast du dies beim bind()-Aufruf bereits genau so gemacht ;)

2. incompatible implicit declaration of built-in function ‘printf’
printf() ist in stdio.h deklariert. Die entsprechende Include-Anweisung fehlt bei dir.
Code:
#include <stdio.h>
 
Zuletzt bearbeitet: (Tippfehler)
Zurück
Oben