Avatar billede don_r Nybegynder
21. oktober 2004 - 15:14 Der er 13 kommentarer og
1 løsning

multitrådet server Sleep

Hej Eksperter

Jeg har fundet et simplet eks. på en multitrådet server på http://www.linuxjournal.com/article.php?sid=1363, men når jeg kompillere får jeg fejl. F.eks. brokker den sig over seep(1).

Det hele er lavet i en C++ fil på linux...


/**************************
**
** simple multi-threaded server
**
**
*/
#define _REENTRANT
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
using namespace std;
/* the port on which to accept connections */
#define SERVERPORT 12345
/* function prototypes */
void* serverWatch( void* );
void* serveClient( void* );
int main( void )
{
  pthread_t watcher_thr;
  pthread_create(&watcher_thr, NULL, serverWatch, (void*)NULL);
  for(;;) {
    /* do something useful */
    printf( "server is running\n" );
    pthread_yield();
    sleep(1);
  }
}
/*************
**
** serverWatch()
**
** watch for a client trying to connect
**
** the argument to the function is not used
**
*/
void* serverWatch( void* dummy )
{
  pthread_t dummy_thr;
  int srv_socket;
  int accepted_socket;
  int size;
  struct sockaddr_in port_addr, accept_addr;
  int set_opt = 1;
 
  fd_set read_set;
  int ready_fd;
  /* set up the socket on the server port */
  port_addr.sin_family = AF_INET;
  port_addr.sin_addr.s_addr = htonl( INADDR_ANY );
  port_addr.sin_port = htons( SERVERPORT );
  srv_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  setsockopt( srv_socket, SOL_SOCKET, SO_REUSEADDR,
          (char*)&set_opt, sizeof( set_opt ) ); 
  bind( srv_socket, (struct sockaddr*)&port_addr, sizeof(port_addr));
  for(;;) {
    /* wait for the client to try to connect */
    listen( srv_socket, 5 );
    FD_ZERO(&read_set);
    FD_SET( srv_socket, &read_set );
    do {
      ready_fd = select(srv_socket+1, &read_set, NULL, NULL, NULL);
    }
    while (ready_fd <= 0 || !FD_ISSET(srv_socket, &read_set) );
    /* a client has connected. Accept their connection and create a
    * thread to serve the client
    */
    size = sizeof( accept_addr );
    accepted_socket = accept(srv_socket, (struct sockaddr*)&accept_addr,
                  &size);
    pthread_create(&dummy_thr, NULL, serveClient, (void*)accepted_socket);
  }
}
/*************
**
** serve the client on the specified socket
**
*/
void* serveClient( void* socket )
{
  char buffer[256];
  for(;;) {
    strcpy( buffer, "Type 'X' to quit\n" );
    write( (int)socket, buffer, strlen(buffer) );
    if (read( (int)socket, buffer, 255) > 0 ) {
      if ( buffer[0] == 'X' ) {
    close( (int)socket );
    pthread_exit( NULL );
      }
    }
  }
}
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:16 #1
Prøv og tilføj:

#include <unistd.h>

den burde løse problem med sleep
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:16 #2
Og post andre fejl her, så vi kan vurdere dem
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:21 #3
Det hjalp, men der er stadig følgende problemer


Kompilerer fil: multiTraadServer.cc...
g++      -c "multiTraadServer.cc" -o "multiTraadServer.o"
multiTraadServer.cc: In function `void* serverWatch(void*)':
multiTraadServer.cc:71: invalid conversion from `int*' to `socklen_t*'
multiTraadServer.cc: In function `void* serveClient(void*)':
multiTraadServer.cc:84: `strcpy' undeclared (first use this function)
multiTraadServer.cc:84: (et kaldenavn der ikke er erklæret, rapporteres kun
  én gang per funktion)
multiTraadServer.cc:85: `strlen' undeclared (first use this function)
Completed ... unsuccessful
Total time taken: 1 secs
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:24 #4
#include <string.h>
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:25 #5
sådanne så mangler kun den her:

Kompilerer fil: multiTraadServer.cc...
g++      -c "multiTraadServer.cc" -o "multiTraadServer.o"
multiTraadServer.cc: In function `void* serverWatch(void*)':
multiTraadServer.cc:72: invalid conversion from `int*' to `socklen_t*'
Completed ... unsuccessful
Total time taken: 1 secs


Det er i linien:
accepted_socket = accept(srv_socket, (struct sockaddr*)&accept_addr,&size);
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:28 #6
Prøv og ændre size fra at være en int til at være en size_t
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:29 #7
Sådanne thanks
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:30 #8
Svar lige :)
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:30 #9
UPS....hmmm
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:31 #10
Da jeg byggede gik det lidt galt... HAr du 2 min mere for samme point ???
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:31 #11
Bygger fil: multiTraadServer.cc...
g++      "multiTraadServer.cc"    -o "multiTraadServer"
/tmp/ccqQ7Drl.o(.text+0x1e): In function `main':
: udefineret reference til "pthread_create"
/tmp/ccqQ7Drl.o(.text+0x36): In function `main':
: udefineret reference til "pthread_yield"
/tmp/ccqQ7Drl.o(.text+0x19e): In function `serverWatch(void*)':
: udefineret reference til "pthread_create"
collect2: ld returned 1 exit status
Completed ... unsuccessful
Total time taken: 1 secs
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:34 #12
Du skal bygge med:

-lpthread

eller

-lpthreads
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:34 #13
svar
Avatar billede don_r Nybegynder
21. oktober 2004 - 15:38 #14
takker, jeg skal lige finde ud af hvordan jeg sætter det ind i min editor, men det virker fra commandline.
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