Compilerprobleme Server

Gast #2166166
Lesenswert?

Hi,

ich wollte gerade aus einem Buch einen minimalen Server für Linux 
nachprogrammieren (in C). beim compilieren kommt jetzt aber folgende 
Meldung:
1
gcc -Wall -Werror -pedantic -c server.c
2
cc1: warnings being treated as errors
3
server.c: In function ‘main’:
4
server.c:114:47: error: passing argument 2 of ‘bind’ from incompatible pointer type
5
/usr/include/sys/socket.h:115:12: note: expected ‘const struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
6
server.c:130:5: error: passing argument 2 of ‘accept’ from incompatible pointer type
7
/usr/include/sys/socket.h:214:12: note: expected ‘struct sockaddr * __restrict__’ but argument is of type ‘struct sockaddr_in *’
8
server.c:130:5: error: pointer targets in passing argument 3 of ‘accept’ differ in signedness
9
/usr/include/sys/socket.h:214:12: note: expected ‘socklen_t * __restrict__’ but argument is of type ‘int *’
10
make: *** [server.o] Fehler 1

Bin jetzt etwas ratlos weil ich davon ausgegangen bin das das Programm 
aus dem Buch funktionieren sollte.

das sollte die betroffene Stellen im Quellcode sein:
1
...
2
  int main(){
3
  int sock_fd, client_fd, err, addr_size, pid;
4
  struct sockaddr_in my_addr, client_addr;
5
  
6
  sock_fd = socket(PF_INET, SOCK_STREAM, 0);
7
  if (sock_fd == -1)
8
    err_exit("webserver: Can't create new socket");
9
  
10
  my_addr.sin_family = AF_INET;
11
  my_addr.sin_port = htons(MY_PORT);
12
  my_addr.sin_addr.s_addr = INADDR_ANY;
13
  
14
  err = bind(sock_fd, &my_addr, sizeof(struct sockaddr_in));
15
  if (err == -1)
16
    err_exit("webserver: bind() failed");
17
  
18
  setuid(getuid());
19
  
20
  err = listen(sock_fd, N_CONNECTIONS);
21
  if (err == -1)
22
    err_exit("webserver: listen() failed");
23
  
24
  signal(SIGCHLD, SIG_IGN);
25
  
26
  printf("Type Ctrl-C to stop.\n");
27
  
28
  while (1){
29
    addr_size = sizeof(struct sockaddr_in);
30
    client_fd = accept(sock_fd, &client_addr, &addr_size);
31
    if (client_fd == -1)
32
      err_exit("webserver: accept() failded");
33
...

lg michael
Persönliche Seite #2166202
Lesenswert?

Hier ist ein typecast angesagt:
1
  err = bind(sock_fd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in));

Das ist /zulässig/:
1
In memory, the struct sockaddr_in and struct sockaddr_in6 share the same 
2
beginning structure as struct sockaddr, and you can freely cast the pointer 
3
of one type to the other without any harm, except the possible end of the universe.
4

5
Just kidding on that end-of-the-universe thing...if the universe does end when 
6
you cast a struct sockaddr_in* to a struct sockaddr*, I promise you it's pure 
7
coincidence and you shouldn't even worry about it.
8

9
So, with that in mind, remember that whenever a function says it takes a 
10
struct sockaddr* you can cast your struct sockaddr_in*, struct sockaddr_in6*,
11
or struct sockadd_storage* to that type with ease and safety.

Quelle: 
http://beej.us/guide/bgnet/output/html/multipage/sockaddr_inman.html

Die Bezüge auf IPv6 kannst Du hier getrost ignorieren.
Gast #2166762
Lesenswert?

Hi,

das mit dem typecast war auch meine erste Idee, veränderte aber nix an 
der Fehlermeldung. Ich hab in der Zwischenzeit mal die Option -Werror 
aus dem Makefile entfernt. Damit kann ich das Programm zwar compilieren 
aber beim ausführen scheitert das Programm genau an diesen Stellen.
1
webserver: bind() failed: Permission denied
Gast #2166878
Lesenswert?

Mit root-Rechten läuft er.
Bzgl. der Fehler nehm ich mal an, dass typecast mit der Compileroption 
-Wall eine Warnung auslösen, die dann von -Werror als Fehler 
interpretiert wird. Ohne die Option -Werror funktioniert es jedenfalls.

Danke für eure Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren