Forum: Compiler & IDEs Compilerprobleme Server


von mr08b002 (Gast)


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

von Googler (Gast)


Lesenswert?

Erster Google treffer:
http://www.linuxhowtos.org/C_C++/socket.htm

Die Stelle die du brauchst wirst du selber finden, oder?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von mr08b002 (Gast)


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

von root (Gast)


Lesenswert?

Wenn der Webserver an einen priviligierten Port binden soll
(z.B. Port 80), musst du ihn als "root" starten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

mr08b002 schrieb:
> das mit dem typecast war auch meine erste Idee, veränderte aber nix an
> der Fehlermeldung.

Wie soll das gehen?
Daß "die Fehlermeldung" drei unterschiedliche Fehler an drei (naja, 
genaugenommen zwei) unterschiedlichen Stellen im Code sind, hast Du aber 
schon gesehen?

von mr08b002 (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.