Avatar billede don_r Nybegynder
08. december 2004 - 11:15 Der er 3 kommentarer og
1 løsning

Trådet server store problemer

Hej Eksperter.

Vi har lavet en trådet webserver server til et skoleprojekt, men der er noget helt galt. Det er som om at der accepteres flere connections til clienten. Men at det sidste request er toms, det får vores webserver til at sende en bad request tilbage. Vi har med livehttpheaders set at der ikke sendes mere en et request fra clienten. så det giver ingen menning.

Her vores listener
void Listner::startListen(int _port){
  pthread_t dummy_thr;
  int srv_socket;
  int accepted_socket;
  size_t 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( _port );
  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);
  }
}


//For hver accepted connection kaldes: i en ny tråd
void* Listner::serveClient( void* socket )
{
    cout << "INDE I SERVECLIENT:"<<int(socket)<<":\n" << flush;
    INetSocket *newSocket = new INetSocket;
    newSocket->sock = (int)socket;
    ServeClient* client = new ServeClient; 
    client->setINetSocket(newSocket);
    client->startServe();
    close( (int)socket );
   
}

// Vi kan se at den går in i denne funktion 2 gange på et request..client->startServe(); læser bare på request og åbner en fil og sender den tilbage med en httpheader. Virker fint.
Avatar billede segmose Nybegynder
10. december 2004 - 09:57 #1
pthread_create hvad siger man om den også første argument? NULL hvis man ikke skal bruge id til noget? hvis så ingen grund til at have dummy_thr.
hvilken return værdier giver pthread_create?
er der nogen af de andre funktioner der kan fejle med andet end crash?
Avatar billede zapzap Nybegynder
11. januar 2005 - 16:06 #2
Tror i skal have listen() ud af for(;;) sløjfen (min egen er udenfor...).
Avatar billede don_r Nybegynder
17. august 2005 - 13:21 #3
send svar
Avatar billede don_r Nybegynder
20. august 2005 - 19:25 #4
lukker spg.
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