Avatar billede morw Nybegynder
29. marts 2003 - 01:58 Der er 6 kommentarer og
2 løsninger

Fra C til C++

Hej

jeg vil gerne kunne lave dette i C++, så jeg senere kan arbejde med C++ features, men kan ikke compile under g++ (virker under gcc)

fejl:

> g++ server.c -o ww
server.c: In function `int main()':
server.c:35: implicit declaration of function `int memset(...)'
server.c:49: passing `int *' as argument 3 of `accept(int, sockaddr *, socklen_t *)' changes signedness

Sovs:

/* <---- SOURCE CODE STARTS HERE ----> */

#include <stdio.h>          /* These are the usual header files */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
// mw
#include <netdb.h>          // For gethostbyname()
#include <arpa/inet.h>      // For inet_addr()
#include <unistd.h>          // For close()

#define PORT 3550  /* Port that will be opened */
#define BACKLOG 2  /* Number of allowed connections */

main()
{

  int fd, fd2; /* file descriptors */

  struct sockaddr_in server; /* server's address information */
  struct sockaddr_in client; /* client's address information */

  int sin_size;


  if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  /* calls socket() */
    printf("socket() error\n");
    exit(-1);
  }

  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);  /* Remember htons() from "Conversions" section? =) */
  server.sin_addr.s_addr = INADDR_ANY;  /* INADDR_ANY puts your IP address automatically */
  //bzero(&(server.sin_zero),8); /* zero the rest of the structure */
  memset(&(server.sin_zero), '\0', 8);

  if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){ /* calls bind() */
      printf("bind() error\n");
      exit(-1);
  }

  if(listen(fd,BACKLOG) == -1){  /* calls listen() */
      printf("listen() error\n");
      exit(-1);
  }

while(1){
  sin_size=sizeof(struct sockaddr_in);
  if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
    printf("accept() error\n");
    exit(-1);
  }

  printf("You got a connection from %s\n",inet_ntoa(client.sin_addr) ); /* prints client's IP */

  send(fd2,"Welcome to my server.\n",22,0); /* send to the client welcome message */

  close(fd2); /*  close fd2 */
}
}

/* <---- SOURCE CODE ENDS HERE ----> */
Avatar billede morw Nybegynder
29. marts 2003 - 02:02 #1
#include <string.h> klarede den første fejl med memset. Ved dog ikke hvorfor
Avatar billede morw Nybegynder
29. marts 2003 - 02:08 #2
Skulle være en socklen_t i stedet for en int. Problem løst - så må det være sengetid.
Avatar billede phrame Nybegynder
29. marts 2003 - 02:08 #3
hmmm... er du fra niels brock og igang med 3.sem imap server?
tester lige kode på en redhat box
Avatar billede phrame Nybegynder
29. marts 2003 - 02:24 #4
Jeg får følgende fejl:

server.c: In function `int main ()':
server.c:28: `exit' undeclared (first use this function)
server.c:28: (Each undeclared identifier is reported only once for each
function it appears in.)
server.c:35: `memset' undeclared (first use this function)
server.c:49: cannot convert `int *' to `socklen_t *' for argument `3'
to `accept (int, sockaddr *, socklen_t *)'


Følgende skal tilføjes:
#include <stdlib.h>
#include <string.h>
using namespace std;

samt skal din erklæring af "int sin_size;" hedde "socklen_t sin_size;"....

så får jeg er kompilering uden fejl
Avatar billede phrame Nybegynder
29. marts 2003 - 02:26 #5
hvis du har problmer med funktioner på linux, så prøv at brug "man" funktionen, fx "man memset" der får du beskrevet at du skal huske at include string.h, da memset er en funktion i denne klasse
Avatar billede phrame Nybegynder
29. marts 2003 - 02:27 #6
hehheh... du fandt vist frem til noget af det selv...
Avatar billede morw Nybegynder
29. marts 2003 - 11:16 #7
Nej, jeg er ikke fra NB. Jeg roder bare med lidt c++ på min FreeBSD boks.

Jeg forstår bare ikke hvorfor gcc ikke skal have <string.h>. Jeg har i øvrigt ændret den til <string> i stedet for <string.h) da det jo er mere korrekt.
Avatar billede phrame Nybegynder
29. marts 2003 - 11:25 #8
næh... det er også lidt underligt....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester